我编写了以下代码来提取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}