问题

问题

问题

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在需要时将其定义为。

相关内容