我需要将未展开的 LaTeX 写入文件。该宏\OuputToFile
基本上是一个\immediate\write18
,可以很好地与以下内容配合使用:
\OuputToFile{\detokenize{$\OuterMacro{\cXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\dXXX{X}}$}}%
内部宏以c
和开头d
。但是,如果它们以e
或 开头,则会出现问题f
。也就是说,以下代码不会产生预期的结果:
\OuputToFile{\detokenize{$\OuterMacro{\eXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\fXXX{X}}$}}%
为什么会这样,但更重要的是我该如何补救这种情况?
下面的 MWE 的输出是
但期望的结果是
代码:
\documentclass{article}
\usepackage{xparse}
\immediate\write18{printf "\\n" > foo.tex }% Initialize File
\NewDocumentCommand{\OuputToFile}{%
m% string to output
}{%
\immediate\write18{printf 'string = "#1"' >> foo.tex }%
\immediate\write18{printf "\\n" >> foo.tex }%
}
\def\MyString{$\OuterMacro{\InnerMacro{X}}$}
\begin{document}
Output to file:
\OuputToFile{\detokenize{$\OuterMacro{\cXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\dXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\eXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\fXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\gXXX{X}}$}}%
\end{document}
答案1
这与 TeX 无关,\e
是一个控制字符printf
。
如果你试试
printf "\cXXX"
在命令行上你得到 \cXXX
但如果你尝试
printf "\eXXX"
你什么也得不到。
你可以使用
echo -n "\eXXX"
或者
printf "%s" "\eXXX"
两者都会产生\eXXX
,所以...
\documentclass{article}
\usepackage{xparse}
\immediate\write18{printf "\\n" > foo.tex }% Initialize File
\makeatletter
\NewDocumentCommand{\OuputToFile}{%
m% string to output
}{%
\immediate\write18{printf '\@percentchar s' 'string = "#1"' >> foo.tex }%
\immediate\write18{printf "\\n" >> foo.tex }%
}
\makeatother
\def\MyString{$\OuterMacro{\InnerMacro{X}}$}
\begin{document}
Output to file:
\OuputToFile{\detokenize{$\OuterMacro{\cXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\dXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\eXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\fXXX{X}}$}}%
\OuputToFile{\detokenize{$\OuterMacro{\gXXX{X}}$}}%
\end{document}
产生foo.tex
string = "$\OuterMacro {\cXXX {X}}$"
string = "$\OuterMacro {\dXXX {X}}$"
string = "$\OuterMacro {\eXXX {X}}$"
string = "$\OuterMacro {\fXXX {X}}$"
string = "$\OuterMacro {\gXXX {X}}$"