LaTeX外部定义文档类型时宏比较失败问题求助
问题原因与解决方案
问题根源
你遇到的问题是\ifx的比较逻辑导致的:\ifx比较的是两个宏的定义结构,而非它们展开后的实际内容。
在MWE2中,\docShortcut被定义为\gdef\docShortcut{\docpropPTdocShortcut}——它本质是一个指向\docpropPTdocShortcut的引用宏,而非直接存储字符串svvr。当你执行\edef\docTypeExt{\docShortcut}时,\docTypeExt的定义会和\docShortcut完全一致(即指向\docpropPTdocShortcut),但\docTypeSvvr是用\detokenize{svvr}直接生成的字符串宏,两者的结构完全不同,所以\ifx比较必然失败。
解决方案1:展开宏内容后再定义\docTypeExt
修改\docTypeExt的定义,先用\expandafter展开\docShortcut到最终字符串,再用\detokenize统一格式,确保和目标宏结构一致:
\documentclass{article} % Given code, defined in included TeX file: 'svvr', 'srs', ... \newcommand { \docpropPTdocShortcut } {svvr} % Define document type here! \gdef\docShortcut{\docpropPTdocShortcut} % Own TeX file: \begin{document} % 先展开\docShortcut得到实际内容,再转成标准字符串 \edef\docTypeExt{\expandafter\detokenize\expandafter{\docShortcut}} \edef\docTypeSvvr{\detokenize{svvr}} \edef\docTypeSrs{\detokenize{srs}} \textbf{\jobname} \textbf{\docShortcut} \textbf{\docTypeSvvr} \textbf{\docTypeSrs} \\newline \ifx\docTypeExt\docTypeSvvr true \else false: \\ \jobname \\ \docShortcut \\ \docTypeSvvr \fi \newline \ifx\docTypeExt\docTypeSrs true \else false: \\ \jobname \\ \docShortcut \\ \docTypeSrs \fi \end{document}
解决方案2:直接用字符串比较函数(更简洁)
如果使用pdfTeX引擎(比如pdflatex),可以用\pdfstrcmp直接比较宏展开后的字符串内容,无需额外定义中间宏:
\documentclass{article} % Given code, defined in included TeX file: 'svvr', 'srs', ... \newcommand { \docpropPTdocShortcut } {svvr} % Define document type here! \gdef\docShortcut{\docpropPTdocShortcut} % Own TeX file: \begin{document} \textbf{\jobname} \textbf{\docShortcut} \\newline \ifnum\pdfstrcmp{\docShortcut}{svvr}=0 true \else false: \\ \jobname \\ \docShortcut \fi \newline \ifnum\pdfstrcmp{\docShortcut}{srs}=0 true \else false: \\ \jobname \\ \docShortcut \fi \end{document}
\pdfstrcmp{<字符串1>}{<字符串2>}会自动展开宏到最终字符串,返回0表示相等,非0表示不等,逻辑更直观,也避免了宏结构不匹配的问题。
内容的提问来源于stack exchange,提问作者ruriger
相关产品推荐
相关产品推荐

