如何在排版数学的同时输出数学环境代码?

如何在排版数学的同时输出数学环境代码?

我有一个定义了很多符号的序言和一个用于测试它们的 LaTeX 文档。具体来说,我有这样的源代码:

\[\wlength{abc} = 3\]
\[\lang{A} = \lang{\varphi}\]
\[\kplus{L} \defeq \kstar{L} \setminus \emptyword\]

忠实地创造了这一点:

默认输出

现在我想使用相同的 PDF 作为需要显示源代码的参考。也就是说,我想要这样的东西:

在此处输入图片描述

理想情况下,我在这里手动执行的操作(将源复制到环境中Verbatimfancvrb会自动完成;为什么要把同一件事写下两次,把一切都搞砸呢?

这能做到吗?如果能,怎么做?我想你必须重写数学环境的翻译方式,但这超出了我的能力范围。

pdflatex优先使用以下解决方案。

答案1

对于简短的数学运算,您可以使用以下方法。对于较长的方程式,它可能不会给您带来良好的结果。

\documentclass{article}

\let\mopen\[
\let\mclose\]

\def\[#1\]{%
    \par\noindent
    \framebox[\linewidth]{\texttt{\detokenize{#1}}}%
    \mopen #1 \mclose
}


\begin{document}
\[a = b^C_D \]
\[A = \varphi\]
\end{document}

结果


对于左对齐输出,您可以使用:

\documentclass{article}

\def\[#1\]{%
    \par\medskip\par\noindent
    \framebox[\linewidth][l]{\texttt{\detokenize{#1}}}%
    \par\smallskip
    \(\displaystyle #1 \)
}


\begin{document}
\[a = b^C_D \]
\[A = \varphi\]
\end{document}

结果2


更新:

这是一个真正的逐字实现,它不会在宏后添加空格。它反过来。它不是正常读取代码然后将其转换为逐字,而是逐字读取,然后在需要时将其转回代码。

我还添加了断行支持。

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\def\[{%
    \begingroup
    \let\do\@makeother
    \dospecials
    \obeyspaces
    \readmath
}
\long\expandafter\def\expandafter\readmath\expandafter#\expandafter1\string\]{%
    \endgroup
    \par\medskip\par\noindent
    \fbox{\minipage{\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax}\raggedright\verbatim@font #1\endminipage}%
    \par\smallskip
    \(\displaystyle \scantokens{#1} \)%
    \par
}
\makeatother

\begin{document}

\[a = b^C_D \]

\[A = \varphi\]


\[a = b^C_\text{i} \]


\[ a = 
\alpha_1 + \beta_1 + \gamma_1 +
\alpha_2 + \beta_2 + \gamma_2 +
\alpha_3 + \beta_3 + \gamma_3 +
\alpha_4 + \beta_4 + \gamma_4
\]

\end{document}

结果3


这一切都需要 e-TeX,它是任何现代 LaTeX 编译器的一部分。如果需要,我可以编写一个替代方案。

相关内容