我之前成功将标签符号 # 写入输出文件。请参阅以下 MWE。

\documentclass{book}
\usepackage{newverbs}

\Verbdef\myHashtagSymbolOne{#}%
\newcommand*{\myWriteNewLine}{^^J}%
\newwrite\myOutputFileName%

\begin{document}
\edef\myHashtagSymbolTwo{\myHashtagSymbolOne}%
\edef\myHashtagSymbolThree{\detokenize\expandafter{\myHashtagSymbolTwo}}%

\immediate\openout\myOutputFileName=hashtag.tex%
\immediate\write\myOutputFileName%
{%
Here is my hashtag:%
\myWriteNewLine%
\myHashtagSymbolThree%
}%
\immediate\closeout\myOutputFileName%

\end{document}

我使用 pdflatex 和 shellescape (MikTeX) 进行编译,运行良好。

请注意,输出文件 hashtag.tex 曾经包含以下内容:

这是我的标签:

在 MWE 中,我们可以看到目标是\myHashtagSymbolThree出现在输出文件中。我们还注意到,有一些“中间”变量,例如\myHashtagSymbolOne\myHashtagSymbolTwo,这些变量对于我的实际(长)程序的运行是必需的(这些变量在我的程序中有其他用途,但不再显示在这里)。

现在,我几天前更新了我的 MikTeX 程序。我还更新了所有软件包,包括 newverbs 软件包。出于某种原因,当我编译我的程序时,输出文件 hashtag.tex 中现在出现了以下内容:

这是我的标签:

\protect #

突然,不必要的命令\protect突然出现。这种出现对我来说是无法接受的,因为由于 的出现,使用输出文件的其他程序不再正常运行\protect。为了验证这确实\protect是导致问题的原因,我暂时从输出文件中删除了它,现在使用输出文件的其他程序可以正常工作。这让我得出结论,\protect不应该在那里。但我不知道它为什么突然出现。我想要的只是出现标签(没有\protect)。

恳请您的帮助。

答案1

如果我使用 2020 版本之前的 TeX Live(使用newverbs1.4 或更早版本),它可以工作;使用 TeX Live 2020 或 2021,我得到newverbs1.6 版本,它使用不同的方法\Verbdef

版本 1.6

\newcommand*\Verbdef{%
    \@ifstar
        {\@Verbdef*}%
        {\@Verbdef{}}%
}
\def\@Verbdef#1#2{%
    \Collectverb#1{\DeclareRobustCommand#2}%
}

版本 1.4

\newcommand*\Verbdef{%
    \@ifstar
        {\@Verbdef*}%
        {\@Verbdef{}}%
}
\def\@Verbdef#1#2{%
    \Collectverb#1{\def#2}%
}

我不知道马丁为什么选择这样做\DeclareRobustCommand:我们只能看到

% \changes{v1.6}{2021/01/06}{Changed \cs{Verbdef} to define robust commands.}

dtx文件中。

另一方面,您可以简单地使用\string#

\immediate\write\myOutputFileName{%
  Here is my hashtag:\myWriteNewLine
  \string#
}
\immediate\closeout\myOutputFileName

收集逐字材料并将其存储到“命名变量”中的另一种方法不会出现此问题:

\documentclass{book}

\ExplSyntaxOn

\NewDocumentCommand{\xverbdef}{mv}
 {
  \tl_clear_new:c { l_xverbdef_#1_tl }
  \tl_set:cn  { l_xverbdef_#1_tl } { #2 }
 }
\NewExpandableDocumentCommand{\useverb}{sm}
 {
  \IfBooleanTF{#1}
   { \tl_use:c { l_xverbdef_#2_tl } }
   { \useverbp { #2 } }
 }
\NewDocumentCommand{\useverbp}{m}
 {
  \tl_use:c { l_xverbdef_#1_tl }
 }

\ExplSyntaxOff

\xverbdef{hash}{#}

\newcommand*{\myWriteNewLine}{^^J}

\newwrite\myOutputFileName

\begin{document}

\tableofcontents

\section{\useverb{hash}}

\immediate\openout\myOutputFileName=\jobname-out.tex
\immediate\write\myOutputFileName{%
  Here is my hashtag:\myWriteNewLine
  \useverb*{hash}%
}
\immediate\closeout\myOutputFileName

We can also use the character elsewhere \useverb{hash}

\end{document}

当您想使用“原始”内容时,请执行\useverb*{<name>}

打印输出

在此处输入图片描述

写出的文件

Here is my hashtag:
#

答案2

这可以工作。事实上,\myHashtagSymbolOne以及\myHashtagSymbolTwo也会输出一个单独的#

\documentclass{book}
%\usepackage{newverbs}

\edef\myHashtagSymbolOne{\string#}%
\newcommand*{\myWriteNewLine}{^^J}%
\newwrite\myOutputFileName%

\begin{document}
\edef\myHashtagSymbolTwo{\myHashtagSymbolOne}%
\def\myHashtagSymbolThree{\myHashtagSymbolTwo}%

\immediate\openout\myOutputFileName=hashtag.tex%
\immediate\write\myOutputFileName%
{%
Here is my hashtag:%
\myWriteNewLine%
\myHashtagSymbolThree%
}%
\immediate\closeout\myOutputFileName%

\end{document}

相关内容