-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
ENH: add math mode to formatter escape="latex-math" #50398
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
4f9e8e1
43800a4
2fd6d7f
f80a1c4
1c268e8
ad777d1
e80ffbb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -989,6 +989,8 @@ def format( | |
Use 'latex' to replace the characters ``&``, ``%``, ``$``, ``#``, ``_``, | ||
``{``, ``}``, ``~``, ``^``, and ``\`` in the cell display string with | ||
LaTeX-safe sequences. | ||
Use 'latex-math' to replace the characters the same way as in 'latex' mode, | ||
except for math substrings, which start and end with ``$``. | ||
Escaping is done before ``formatter``. | ||
|
||
.. versionadded:: 1.3.0 | ||
|
@@ -1105,16 +1107,28 @@ def format( | |
<td .. >NA</td> | ||
... | ||
|
||
Using a ``formatter`` with LaTeX ``escape``. | ||
Using a ``formatter`` with ``escape`` in 'latex' mode. | ||
|
||
>>> df = pd.DataFrame([["123"], ["~ ^"], ["$%#"]]) | ||
>>> df = pd.DataFrame([["123"], ["~ ^"], ["%#"]]) | ||
>>> df.style.format("\\textbf{{{}}}", escape="latex").to_latex() | ||
... # doctest: +SKIP | ||
\begin{tabular}{ll} | ||
{} & {0} \\ | ||
& 0 \\ | ||
0 & \textbf{123} \\ | ||
1 & \textbf{\textasciitilde \space \textasciicircum } \\ | ||
2 & \textbf{\$\%\#} \\ | ||
2 & \textbf{\%\#} \\ | ||
\end{tabular} | ||
|
||
Using ``escape`` in 'latex-math' mode. | ||
|
||
>>> df = pd.DataFrame([[r"$\sum_{i=1}^{10} a_i$ a~b $\alpha \ | ||
... = \frac{\beta}{\zeta^2}$"], ["%#^ $ \$x^2 $"]]) | ||
>>> df.style.format(escape="latex-math").to_latex() | ||
... # doctest: +SKIP | ||
\begin{tabular}{ll} | ||
& 0 \\ | ||
0 & $\sum_{i=1}^{10} a_i$ a\textasciitilde b $\alpha = \frac{\beta}{\zeta^2}$ \\ | ||
1 & \%\#\textasciicircum \space $ \$x^2 $ \\ | ||
\end{tabular} | ||
|
||
Pandas defines a `number-format` pseudo CSS attribute instead of the `.format` | ||
|
@@ -1743,9 +1757,12 @@ def _str_escape(x, escape): | |
return escape_html(x) | ||
elif escape == "latex": | ||
return _escape_latex(x) | ||
elif escape == "latex-math": | ||
return _escape_latex_math(x) | ||
else: | ||
raise ValueError( | ||
f"`escape` only permitted in {{'html', 'latex'}}, got {escape}" | ||
f"`escape` only permitted in {{'html', 'latex', 'latex-math'}}, \ | ||
got {escape}" | ||
) | ||
return x | ||
|
||
|
@@ -2344,3 +2361,36 @@ def _escape_latex(s): | |
.replace("^", "\\textasciicircum ") | ||
.replace("ab2§=§8yz", "\\textbackslash ") | ||
) | ||
|
||
|
||
def _escape_latex_math(s): | ||
r""" | ||
All characters between two characters ``$`` are preserved. | ||
|
||
The substrings in LaTeX math mode, which start with the character ``$`` | ||
and end with ``$``, are preserved without escaping. Otherwise | ||
regular LaTeX escaping applies. See ``_escape_latex()``. | ||
|
||
Parameters | ||
---------- | ||
s : str | ||
Input to be escaped | ||
|
||
Return | ||
------ | ||
str : | ||
Escaped string | ||
""" | ||
s = s.replace(r"\$", r"ab2§=§8yz") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I understand what you are doing here, you are substituting out an escaped $ sign, using a proxy uuid string |
||
pattern = re.compile(r"\$.*?\$") | ||
pos = 0 | ||
ps = pattern.search(s, pos) | ||
res = [] | ||
while ps: | ||
res.append(_escape_latex(s[pos : ps.span()[0]])) | ||
res.append(ps.group()) | ||
pos = ps.span()[1] | ||
ps = pattern.search(s, pos) | ||
|
||
res.append(_escape_latex(s[pos : len(s)])) | ||
return "".join(res).replace(r"ab2§=§8yz", r"\$") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Its fine to change this example. Just curious as to the reason.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I changed uuid string to be unique, as you suggested. And also reverted the example for latex mode. I changed it by mistake, there is nothing wrong with
$
in latex mode (the online latex compiler which I used at first had some sort of bug).CI tests look good.