问题
DocTeX 第一次处理文档时是否可以执行文本替换?具体来说,如何^^J
在'd 宏^^J%%
中替换?\edef
背景
我最近注意到我在重复版权声明在我的 DocTeX 文件中,这个例子不下于三次,这不算特别 DRY。我设法将其缩减为一个\edef
'd 序言,\metadata
。
\edef\metadata{================================================================^^J
\jobname\space(Version\space\fileversion\space-\space\filedate)}^^J
================================================================^^J}
我可以将其扩展为一个\declarepreamble\metatext...\endpreamble
块,方法是将其包装\declarepreamble
到另一个定义中并延迟其扩展,如下所示:
\def\expandamble{\declarepreamble\metatext}
\expandafter\expandamble\metadata
\endpreamble
DocTex 在输出文件中扩展为以下内容。由于====
没有宏定义,这会在使用生成的样式/类文件的其他文档中触发错误。
%%==================================
PACKAGE (Version 0.0 - 2019/01/15)
==================================
理想情况下\MetaPrefix
,即%%
,应该按如下方式添加到每一行前面。
%%==================================
%%PACKAGE (Version 0.0 - 2019/01/15)
%%==================================
显然,它只是添加到第一行前面,因为我执行的扩展解压\metadata
后是一行文本,而不是 3 行。我不确定如何正确处理此扩展,希望得到一些帮助。
家庭作业
David Carlisle 在此提供了以下片段回答
\def\replace#1#2#3{%
\def\tmp##1#2{##1#3\tmp}%
\tmp#1\stopreplace#2\stopreplace}
\def\stopreplace#1\stopreplace{}
然而,似乎第一个\metadata
参数可能不会出现。那就是调用宏
\replace{\metadata}{^^J}{^^J\MetaPrefix} % This result should be assigned to a new macro/preamble \metatext
产生以下错误,抱怨我尚未处于文档环境中,而且在 DocTeX 第一次传递过程中我永远不会处于文档环境中。
! LaTeX Error : Missing \begin{document}.
更新
结合 Phelype Oleinik 的评论,我得到了以下代码
\def\expandamble{\declarepreamble\metatext}
\expandafter\expandamble\expandafter\replace\expandafter{\metadata}{^^J}{^^J\MetaPrefix}
\endpreamble
以及以下错误
! Illegal parameter number in definition of \metatext.
<to be read again>
1
笔记
这与另一个相关问题我目前处于开放状态。我正尝试通过将其分解为组件问题来解决问题。
答案1
你得到终端输出
================================================================
bb280 (Version v1.2 - yesterday)
================================================================
%%================================================================
%%bb280 (Version v1.2 - yesterday)
%%================================================================
%%
从
\makeatletter
\def\fileversion{v1.2}
\def\filedate{yesterday}
\def\metadata{================================================================\newline
\jobname\space(Version\space\fileversion\space-\space\filedate) \newline
================================================================\newline}
{\def\newline{^^J}\xdef\metadataA{\metadata}}
{\def\newline{^^J\@percentchar\@percentchar}\xdef\metadataB{\@percentchar\@percentchar\metadata}}
\typeout{\metadataA}
\typeout{\metadataB}
\stop
^^J
如果要替换它,则无需原来放入,使用更容易重新定义的东西,并^^J
在需要时将其定义为。