在 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}
我没有声称这是健全的,所以也许其他人可以做得更好。