我之前成功将标签符号 # 写入输出文件。请参阅以下 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(使用newverbs
1.4 或更早版本),它可以工作;使用 TeX Live 2020 或 2021,我得到newverbs
1.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}