我正在处理瑞典语文件fmtcount
并且,为了支持 的某些fmtcount
命令(例如\Numberstring
和NUMBERstring
),我需要创建包含瑞典语字符å
、ä
和ö
大写的字符串。这在XeTeX
和中似乎没有问题LuaTeX
,但在 中则不然pdfTeX
。
宏观层面
我想要实现的完整版本尽可能少地涉及我的 LaTeX 笨手笨脚,如下所示。因为我自己的语言文件基于德语语言文件 (fc-german.def
),我在这里对该文件做了最小的更改以突出问题,这导致编译根本pdfTeX
无法完成。如果没有我的更改,文档将显示“Acht”,而如果有我的更改,我希望它会显示“Åtta”。
\documentclass[german]{article}
% \usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{fmtcount}
\FCloadlang{german}
\makeatletter
% Redefine code from fc-german.def
\renewcommand*\@@unitstringgerman[1]{%
\ifcase#1%
null%
\or ein%
\or zwei%
\or drei%
\or vier%
\or f\"unf%
\or sechs%
\or sieben%
\or åtta% Changed from "acht" to "åtta"
\or neun%
\fi
}%
\global\let\@@unitstringgerman\@@unitstringgerman
\makeatother
\begin{document}
\newcounter{mycounter}
\setcounter{mycounter}{8} \themycounter\ \Numberstring{mycounter}\\
\end{document}
- 如果我取消注释
\usepackage[T1]{fontenc}
,那么编译仍然无法完成。 - 如果我写
{\aa}tta
的不是åtta
,那么编译就会崩溃。 - 如果我写的
{\aa}tta
不是åtta
和取消注释\usepackage[T1]{fontenc}
,则再次编译无法完成。
我笨拙地尝试接近微观层面
我思考这个例子和宏观层面的问题是一样的。至少它的行为方式是一样的。(它可能与我最后一个问题。
\documentclass{article}
% \usepackage[T1]{fontenc}
\makeatletter
\newcommand*\@@unitstringgerman[1]{%
\ifcase#1%
null%
\or ein%
\or zwei%
\or drei%
\or vier%
\or f\"unf%
\or sechs%
\or sieben%
\or åtta% Changed from "acht" to "åtta"
\or neun%
\fi
}%
\usepackage{etoolbox}
\newcommand*{\zz}{% Supposed to make the first letter of `\@@unitstringgerman{8}` (i.e. "åtta") uppercase
\def\one{}%
\def\two{}%
\eappto\two{\@@unitstringgerman{8}}%
\edef\one{\noexpand\MakeUppercase\expandonce\two}%
\one%
}
\makeatother
\begin{document}
\zz
\end{document}
- 如果我取消注释
\usepackage[T1]{fontenc}
,那么编译仍然无法完成。 - 如果我写
{\aa}tta
的不是åtta
,那么编译就会崩溃。 - 如果我写的
{\aa}tta
不是åtta
和取消注释\usepackage[T1]{fontenc}
,则再次编译无法完成。
答案1
标题大小写最好留给适当的命令。使用相当最新的 LaTeX:
\documentclass{article}
\usepackage[T1]{fontenc}
\makeatletter
\newcommand*\@@unitstringgerman[1]{%
\ifcase#1%
null%
\or ein%
\or zwei%
\or drei%
\or vier%
\or f\"unf%
\or sechs%
\or sieben%
\or åtta% Changed from "acht" to "åtta"
\or neun%
\fi
}%
\begin{document}
\makeatletter
\MakeTitlecase{\@@unitstringgerman{8}}
\makeatother
\end{document}
(使用仅抓取一个标记的“经典”方法\MakeUppercase
在 8 位引擎和非 ASCII 输入时会失败,除了大写和标题大小写不同的少数情况外。)
答案2
这个答案主要包含了约瑟夫的回答将其放入原始问题中的例子以造福后人(因为我对他的答案的编辑没有被接受)。
微观层面
编辑后的示例按预期工作,但仍然存在一些混淆。
- 如果我取消注释
\usepackage[T1]{fontenc}
,则什么也不会改变。 - 如果我写
{\aa}tta
的不是åtta
,那么编译就会崩溃。 - 如果我写的
{\aa}tta
不是åtta
和取消注释\usepackage[T1]{fontenc}
,则再次编译无法完成。
\documentclass{article}
% \usepackage[T1]{fontenc}
\makeatletter
\newcommand*\@@unitstringgerman[1]{%
\ifcase#1%
null%
\or ein%
\or zwei%
\or drei%
\or vier%
\or f\"unf%
\or sechs%
\or sieben%
\or åtta% Changed from "acht" to "åtta"
\or neun%
\fi
}%
\usepackage{etoolbox}
\newcommand*{\zz}{% Supposed to make the first letter of `\@@unitstringgerman{8}` (i.e. "åtta") uppercase
\def\one{}%
\def\two{}%
\eappto\two{\@@unitstringgerman{8}}%
% \edef\one{\noexpand\MakeUppercase\expandonce\two}%
\edef\one{\MakeTitlecase{\two}}%
\one%
}
\makeatother
\begin{document}
\zz
\end{document}
宏观层面
宏观层面的示例也按预期工作,并且其行为与排列的微观示例相同。
\documentclass[german]{article}
% \usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{fmtcount}
\FCloadlang{german}
\makeatletter
% Redefine code from fc-german.def
\renewcommand*\@@unitstringgerman[1]{%
\ifcase#1%
null%
\or ein%
\or zwei%
\or drei%
\or vier%
\or f\"unf%
\or sechs%
\or sieben%
\or åtta% Changed from "acht" to "åtta"
\or neun%
\fi
}%
\global\let\@@unitstringgerman\@@unitstringgerman
\renewcommand*{\@NumberstringMgerman}[2]{%
\@numberstringMgerman{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\makeatother
\begin{document}
\newcounter{mycounter}
\setcounter{mycounter}{8} \themycounter\ \Numberstring{mycounter}\\
\end{document}