当 lineno 包产生虚假文本时使用 \immediate\write18

当 lineno 包产生虚假文本时使用 \immediate\write18

我在使用 \immediate\write18该包时的输出中得到了虚假的文本。lineno平均能量损失 以下文件中产生以下内容foo.tex

在此处输入图片描述

如果注释掉包含该lineno包的行,我就会得到想要的结果:

在此处输入图片描述

我原本以为禁用lineno软件包的功能可以解决这个问题。但是,以下几行并没有解决这个问题:

    \nolinenumbers
    \renewcommand{\thelinenumber}{}%
    \renewcommand\LineNumber{}%

问题:

我如何在宏中禁用这个问题并仍然使用pdf 中包\OuputToFile的功能?lineno

笔记:

  • 不是如果当前目录中有,请运行此命令,foo.tex因为它将被覆盖。
  • 我需要包含lineno生成 PDF 的软件包,并获取我试图在该过程结束时输出的统计数据。我宁愿避免在没有此软件包的情况下进行额外运行,因为这会增加很多额外的处理时间。

代码:

\documentclass{standalone}
\usepackage{xparse}
\usepackage[mathlines,pagewise]{lineno}% <-- Commenting this out yields desired results

\makeatletter
    \immediate\write18{printf "\\n" > foo.tex }% Initialize File
    \NewDocumentCommand{\OuputToFile}{%
        m% string to output
    }{%
        %% None of these solve the issue
        %\nolinenumbers
        %\renewcommand{\thelinenumber}{}%
        %\renewcommand\LineNumber{}%
        \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{\dXXX{X}}$}}%
    \OuputToFile{\detokenize{$\OuterMacro{\eXXX{X}}$}}%
\end{document}

答案1

为了2020-02-02版本中,该\\宏被制作成 (ε-TeX) \protected,而不是像以前那样 (LaTeX) 强大,所以如果你现在写:

\immediate\write17{hello\\world}

它将打印hello\\world在终端中(或打印到文件中)。以前的版本(lineno基于的版本)只有\\robust(用 声明\DeclareRobustCommand),因此在裸机中使用它\write会使其爆炸(您需要改用\protected@write)。 lineno仍然有一个旧的非\protected版本,所以当您加载它时,BOOM!

您可以重新定义\\\protected在您的文档中:

\NewCommandCopy\oldbackslash\\
\protected\def\\{\oldbackslash}

或者(在这种情况下可能更有意义)使用\string\\

\documentclass{standalone}
\usepackage{xparse}
\usepackage[mathlines,pagewise]{lineno}% <-- Commenting this out yields desired results

\makeatletter
    \immediate\write18{printf "\string\\n" > foo.tex }% Initialize File
    \NewDocumentCommand{\OuputToFile}{%
        m% string to output
    }{%
        \immediate\write18{printf '\@percentchar s' 'string = "#1"' >> foo.tex }%
        \immediate\write18{printf "\string\\n" >> foo.tex }%
    }
\makeatother

\def\MyString{$\OuterMacro{\InnerMacro{X}}$}


\begin{document}
    Output to file: 
    \OuputToFile{\detokenize{$\OuterMacro{\dXXX{X}}$}}%
    \OuputToFile{\detokenize{$\OuterMacro{\eXXX{X}}$}}%
\end{document}

相关内容