\detokenize 在以“e”或“f”开头的宏上的行为不一致

\detokenize 在以“e”或“f”开头的宏上的行为不一致

我需要将未展开的 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}}$"

相关内容