@@ -1770,6 +1770,7 @@ def csnames(group, names):
17701770 p .group = Forward ()
17711771 p .operatorname = Forward ()
17721772 p .overline = Forward ()
1773+ p .underline = Forward ()
17731774 p .overset = Forward ()
17741775 p .placeable = Forward ()
17751776 p .required_group = Forward ()
@@ -1820,6 +1821,7 @@ def csnames(group, names):
18201821 + p .required_group ("value" ))
18211822
18221823 p .overline <<= cmd (r"\overline" , p .required_group ("body" ))
1824+ p .underline <<= cmd (r"\underline" , p .required_group ("body" ))
18231825
18241826 p .overset <<= cmd (
18251827 r"\overset" ,
@@ -1843,6 +1845,7 @@ def csnames(group, names):
18431845 | p .underset
18441846 | p .sqrt
18451847 | p .overline
1848+ | p .underline
18461849 )
18471850
18481851 p .simple <<= (
@@ -2478,6 +2481,20 @@ def overline(self, s, loc, toks):
24782481 hlist = Hlist ([rightside ])
24792482 return [hlist ]
24802483
2484+ def underline (self , s , loc , toks ):
2485+ body = toks ["body" ]
2486+
2487+ state = self .get_state ()
2488+ thickness = state .get_current_underline_thickness ()
2489+
2490+ # Place underline below body (loosely based on node735).
2491+ kern = 3 * thickness
2492+ vlist = Vlist ([Hlist ([body ]), Kern (kern ), Hrule (state , thickness )])
2493+ vlist .shift_amount = kern + thickness / 2 + body .depth
2494+
2495+ hlist = Hlist ([vlist ])
2496+ return [hlist ]
2497+
24812498 def _auto_sized_delimiter (self , front , middle , back ):
24822499 state = self .get_state ()
24832500 if len (middle ):
0 commit comments