我有一个定义了很多符号的序言和一个用于测试它们的 LaTeX 文档。具体来说,我有这样的源代码:
\[\wlength{abc} = 3\]
\[\lang{A} = \lang{\varphi}\]
\[\kplus{L} \defeq \kstar{L} \setminus \emptyword\]
忠实地创造了这一点:
现在我想使用相同的 PDF 作为需要显示源代码的参考。也就是说,我想要这样的东西:
理想情况下,我在这里手动执行的操作(将源复制到环境中Verbatim
)fancvrb
会自动完成;为什么要把同一件事写下两次,把一切都搞砸呢?
这能做到吗?如果能,怎么做?我想你必须重写数学环境的翻译方式,但这超出了我的能力范围。
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}
更新:
这是一个真正的逐字实现,它不会在宏后添加空格。它反过来。它不是正常读取代码然后将其转换为逐字,而是逐字读取,然后在需要时将其转回代码。
我还添加了断行支持。
\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}
这一切都需要 e-TeX,它是任何现代 LaTeX 编译器的一部分。如果需要,我可以编写一个替代方案。