使用 xstring 和翻译器

使用 xstring 和翻译器

我编写了以下代码来提取translator包所提供的工作日的首字母:

\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\usetikzlibrary{calendar}

\begin{document}
\StrLeft{\pgfcalendarweekdayname{1}}{1}
\end{document}

输出结果将如预期的那样为“T”(星期二)。我希望它能够处理多语言文档,因此我添加了translator包和语言选项:

\documentclass[german]{article}
\usepackage{translator}
\usepackage{xstring}
\usepackage{tikz}
\usetikzlibrary{calendar}

\begin{document}
\StrLeft{\pgfcalendarweekdayname{1}}{1}
\end{document}

现在编译该文档将会出现以下错误:

! Use of \\translate  doesn't match its definition.
\kernel@ifnextchar ...d@d =#1\def \reserved@a {#2}
                                                  \def \reserved@b {#3}\futu...
l.10 \StrLeft{\pgfcalendarweekdayname{1}}{1}

? 

阅读xstring文档后,我尝试了、、,\noexpandarg但都导致错误。\expandarg\normalexpandarg

有什么办法可以解决这个问题吗?

答案1

你运气不好。这个宏\pgfcalendarweekdayname意味着

\translate{%
  \ifcase #1Monday\or Tuesday\or Wednesday\or Thursday\or Friday\or Saturday\or Sunday\fi
}

并且,如果没有translator\translate则仅返回其参数。

translator加载时,宏\translate会改变其含义,成为一组指令印刷星期几名称。并且它以不可扩展的方式实现,因此不能在的参数中使用\StrLeft

这是一个仅使用可扩展命令的解决方法。

\documentclass[english,ngerman]{article}
\usepackage{babel}
\usepackage{translator}
\usepackage{xstring}
\usepackage{tikz}
\usepackage{xpatch}

\usetikzlibrary{calendar}
\usedictionary{months}

\let\xpgfcalendarweekdayname\pgfcalendarweekdayname
\xpatchcmd{\xpgfcalendarweekdayname}
 {\translate}
 {\xtranslate}
 {}{\ddt}
\makeatletter
\newcommand{\xtranslate}[1]{%
  \csname tr@@@\csname tr@ml@\languagename\endcsname @#1\endcsname
}
\makeatother

\begin{document}

Dienstag: \pgfcalendarweekdayname{1} \StrLeft{\xpgfcalendarweekdayname{1}}{1}

\selectlanguage{english}

Tuesday: \pgfcalendarweekdayname{1} \StrLeft{\xpgfcalendarweekdayname{1}}{1}

\end{document}

在此处输入图片描述

相关内容