在参数内部操纵宏的参数

在参数内部操纵宏的参数

在 LaTeX 中,我有一个宏\p(好吧,它是\paragraph,但也许特定的宏不相关?)带有一个参数。有时我使用它作为

\p{plain text}

有时

\p{\t{alternate 1}{alternate 2}}

(其中是\t,但同样,也许这并不重要)。我想重新定义或修改and/or以便继续正常显示,但更改为hyperref\texorpdfstring\p\t\p{plain text}\p{\t{alt 1}{alt 2}}

\p{\t{\extraformatting{alternate 1}}{alternate 2}}

其中\extraformatting需要确定一些格式化命令。

必须以某种方式完成,以便我将实际写入文件中的内容仍然是\p{}。嗯,它不是;整个练习并不是严格的要求,但我觉得我应该知道如何去做,但我记不住。

我开始使用\iffirsttoken条件句这个答案,其“API”是

\iffirsttoken{<tokenlist>}{<token>}{<true>}{<false>}

我想我可以重新实现测试\p,如果匹配,则以某种方式插入到第一个参数中,否则不执行任何操作:#1\t\extraformatting

\def\p#1{%
  \iffirsttoken{#1}{\t}{%
    ...something goes here...
  }{%
    #1
  }%
}

但我不知道在这种true情况下会发生什么。有什么帮助吗?


以下是可以复制粘贴的 MWE:

\documentclass{article}

% stands in for \paragraph - this is preexisting
\def\p#1{p( #1 )p}
% stands in for \texorpdfstring - this is preexisting
\def\t#1#2{t( #1 )t( #2 )t}

\makeatletter
\def\iffirsttoken#1#2{%
  \expandafter\def\expandafter\@first@token\expandafter{\@car#1\@nil}%
  \expandafter\ifx\@first@token#2\relax\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
\makeatother

% the extra formatting to apply to the first argument of \t
% this I define myself
\def\e#1{e( #1 )e}

\def\p#1{%
  \iffirsttoken{#1}{\t}{%
    % ...something goes here...
  }{%
    #1
  }%
}

\begin{document}
  The following should be ``p( t( e( arg1 )e )t( arg2 )t )p''

  \p{\t{arg1}{arg2}}

  The following should be ``p( text )p''

  \p{text}
\end{document}

答案1

我会说

\usepackage{letltxmacro}
\LetLtxMacro\originalp\p
\LetLtxMacro\originalt\t
\newif\ifp

\renewcommand\p[1]{\ptrue\originalp{#1}\pfalse}

\makeatletter
\renewcommand\t[2]{%
  \originalt{\apply@extraformatting{#1}}{#2}%
}
\newcommand\apply@extraformatting{%
  \ifp
    \expandafter\extraformatting
  \else
    \expandafter\@firstofone
  \fi
}
\makeatother

在这种情况下,\t不需要是参数中的第一个标记\p

答案2

幸运的是,当我正要提交问题时,我找到了答案。我可以利用允许\def指定复杂模式的事实来识别参数,而不仅仅是\def#1#2等。所以我可以编写\def\e\t#1#2识别和提取\e(额外格式)、\t\texorpdfstring)及其两个参数。

\documentclass{article}

% ... lines omitted ...
\makeatother

\def\e\t#1#2{\t{e( #1 )e}{#2}}
\let\oldp=\p
\def\p#1{\iffirsttoken{#1}{\t}{\oldp{\e#1}}{\oldp{#1}}}

\begin{document}
 % ... lines omitted ...
\end{document}

我没有声称这是健全的,所以也许其他人可以做得更好。

相关内容