Cape Town - Aiden Markram hit his second century in three Test matches as South Africa built a sound position on the first day of a four-day, day-night Test at St George's Park on Tuesday.
LIVE: Proteas v Zimbabwe, Day 1 - St George's Park
South Africa were 251 for four at the dinner break, with Markram falling to the last ball before the break for 125.
Markram shared stands of 72 with fellow opener Dean Elgar (31), 96 with stand-in captain AB de Villiers (53) and 78 with Temba Bavuma (35 not out).
Kyle Jarvis dismissed Markram with a ball with the help of a diving catch by wicketkeeper Brendan Taylor. He had figures of two for 38.
Chris Mpofu took the wickets of Hashim Amla and De Villiers while conceding 49 runs.
Opening batsman Markram, 23, continued a dream start to his Test career.
Although he was run out for 97 in his first Test innings against Bangladesh in September he made 143 in the first innings of his second Test against the same opponents.
Markram made a watchful start on Tuesday against some testing bowling from Zimbabwe new ball pair Jarvis and new cap Blessing Muzarabani.
He took 104 balls to reach fifty but accelerated to post his century off 175 balls with 13 fours and a six. He added another four and a six before falling to the 204th ball of his innings.
South Africa were without regular captain Faf du Plessis, who had failed to recover fully from lower back and shoulder injuries, and fast bowler Dale Steyn, whose return from a broken shoulder is now likely to be in the first Test against India, starting in Cape Town on January 5.
De Villiers, making a comeback to Test cricket, was 15 not out at tea. He was the captain in his most recent two Tests, against England in January 2016 but then suffered a long-term elbow injury before deciding to take a break from long-form cricket.