LaTeX:\section 命令中无法识别 \equal

LaTeX:\section 命令中无法识别 \equal

我有以下代码,其中我想使用“\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}

在此处输入图片描述

相关内容