我有以下代码,其中我想使用“\newcommand”控制某些标题和文本的语言。以下最小示例使用新命令“kLanguage”,其中 eng 表示英语,deu 表示德语。
使用 pdflatex 或 lualatex 进行编译时,会出现错误“未定义的控制序列“\equal”,但只有当我在 \section{} 命令中使用宏“\deu”(或 \eng)时才会出现此错误。在命令之外,它可以正常工作。
我错过了什么?
\documentclass[twoside,14pt,a4paper]{extarticle}
\usepackage[paper=a4paper,margin=17mm]{geometry}%
\usepackage{ifthen}
%% use
%% deu for deutsch
%% eng for english
\newcommand{\kLanguage}{deu}
%% Text nur bei deutscher Sprache ausgeben:
\newcommand{\deu}[1]{%
\ifthenelse{\equal{\kLanguage}{deu}}{%%
{#1}}{%%
}%% end ifthenelse
}% end deu
%% Text nur bei englischer Sprache ausgeben:
\newcommand{\eng}[1]{%
\ifthenelse{\equal{\kLanguage}{eng}}{%%
{#1}}{%%
}%% end ifthenelse
}% end deu
\begin{document}
This works: Language is \kLanguage
This works:
\deu{Deutscher Text} \eng{English text}
But this does not work:
\section{\deu{Deutscher Titel}\eng{Englischer Titel}}
\end{document}
答案1
如果使用的是最新的 LaTeX 发行版,我建议使用 expl3 的可扩展例程,\str_if_eq:eeT
而不是如果那么包裹。
原因:如果例程完全可扩展,则在移动参数内部和/或创建 pdf 字符串(例如书签)的地方出现时不会引起问题。
比较书签
\documentclass[twoside,14pt,a4paper]{extarticle}
%\usepackage{expl3}
\usepackage[paper=a4paper,margin=17mm]{geometry}%
\usepackage{hyperref}
%% use
%% deu for deutsch
%% eng for english
\newcommand{\kLanguage}{deu}
%\newcommand{\kLanguage}{eng}
\ExplSyntaxOn
%% Text nur bei deutscher Sprache ausgeben:
\cs_new:Npn \deu #1 { \str_if_eq:eeT {\kLanguage}{deu} {#1} }
%% Text nur bei englischer Sprache ausgeben:
\cs_new:Npn \eng #1 { \str_if_eq:eeT {\kLanguage}{eng} {#1} }
\ExplSyntaxOff
\begin{document}
This works: Language is \kLanguage
This works:
\deu{Deutscher Text}\eng{English text}
This does work:
\section{\deu{Deutscher Titel}\eng{Englischer Titel}}
\end{document}
书签
\documentclass[twoside,14pt,a4paper]{extarticle}
%\usepackage{xparse}
\usepackage[paper=a4paper,margin=17mm]{geometry}%
\usepackage{ifthen}
\usepackage{hyperref}
%% use
%% deu for deutsch
%% eng for english
\newcommand{\kLanguage}{deu}
%\newcommand{\kLanguage}{eng}
%% Text nur bei deutscher Sprache ausgeben:
\NewDocumentCommand{\deu}{m}{%
\ifthenelse{\equal{\kLanguage}{deu}}{%%
#1}{%%
}%% end ifthenelse
}% end deu
%% Text nur bei englischer Sprache ausgeben:
\NewDocumentCommand{\eng}{m}{%
\ifthenelse{\equal{\kLanguage}{eng}}{%%
#1}{%%
}%% end ifthenelse
}% end eng
\begin{document}
This works: Language is \kLanguage
This works:
\deu{Deutscher Text}\eng{English text}
But this does not work: % See the bookmark resulting from the command \section
\section{\deu{Deutscher Titel}\eng{Englischer Titel}}
\end{document}
第二个示例也传递消息
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref) removing `\deu' on input line 35.
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref) removing `\eng' on input line 35.
到控制台和.log文件。
如果你坚持如果那么包,像这样做某事:
\documentclass[twoside,14pt,a4paper]{extarticle}
%\usepackage{xparse}
\usepackage[paper=a4paper,margin=17mm]{geometry}%
\usepackage{ifthen}
\usepackage{hyperref}
%% use
%% deu for deutsch
%% eng for english
\newcommand{\kLanguage}{deu}
%\newcommand{\kLanguage}{eng}
%% Text nur bei deutscher Sprache ausgeben:
\NewDocumentCommand{\deu}{m}{%
\ifthenelse{\equal{\kLanguage}{deu}}{%%
#1}{%%
}%% end ifthenelse
}% end deu
%% Text nur bei englischer Sprache ausgeben:
\NewDocumentCommand{\eng}{m}{%
\ifthenelse{\equal{\kLanguage}{eng}}{%%
#1}{%%
}%% end ifthenelse
}% end eng
\begin{document}
This works: Language is \kLanguage
This works:
\deu{Deutscher Text}\eng{English text}
This does work:
\deu{\section{Deutscher Titel}}\eng{\section{Englischer Titel}}
\end{document}