这个简单的文件在英语中显示错误但在葡萄牙语下编译正常:
\documentclass{report}
\usepackage[english]{babel}
%\usepackage[portuges]{babel}
\begin{document}
\ro
\end{document}
为什么\ro
在一种语言中定义而在另一种语言中没有定义?如何找出在葡萄牙语中定义的是什么 ?还有哪些命令以这种方式定义? Babel 手册中\ro
没有提及。\ro
答案1
如何找出
\ro
葡萄牙语中的“to”的定义?
要了解命令是如何定义的,请使用\show
。运行\show\ro
并查看日志文件,可以发现:
> \ro=macro:
->$^{\rm o}$.
l.8 \show\ro
这表明 (a)\ro
是一个宏,而不是 TeX 原语;(b) 它的定义归结为\def\ro{$^{\rm o}$}
;以及 (c) 它应该在文本模式下使用,而不是数学模式。
我不是葡萄牙语专家,但我相信“first, second, third”的长写形式是“primeiro, segundo, terceiro”,使用 LaTeX/babel 输入符号,就像1\ro, 2\ro, 3\ro
简写一样。根据\ro
上面显示的定义,我让你猜猜输出是什么样子1\ro, 2\ro, 3\ro
的。
显然,\ro
它的作用是将基数“转换”(在印刷意义上!)为序数。请注意,虽然它\ro
不接受明确的参数,但它并不是单独使用的,而是与数字一起使用的。
顺便说一句,葡萄牙语既知道阳性形式,也知道阴性形式;要生成缩写形式的“primeira, segunda, terceira, quarta”,可以将它们输入为1\ra, 2\ra, 3\ra, 4\ra
。例如,“a quarta vez”(“第四次”)可以缩写为a 4\ra~vez
。
为什么
\ro
在一种语言中定义,而在另一种语言中却没有定义?
嗯,因为不同语言的印刷需求不同?
当然,在英语排版中,显然不需要或\ro
宏\ra
。“第一、第二、第三”是当然不以缩写形式书写,就像1\textsuperscript{o}, 2\textsuperscript{o}, 3\textsuperscript{o}
在英语文档中一样。此外,英语不区分阳性和阴性(更不用说中性了!)序数词。
有几种 LaTeX 软件包可以简化和标准化序数的排版。其中一个软件包是尼古拉·塔尔博特 计数,它提供了宏\ordinalnum
,并且具有大量特定于语言的适配功能。(附言:fmtcount
除了宏之外,该包还提供许多其他功能ordinalnum
……)果然,
\documentclass[portuguese]{report}
\usepackage{babel,fmtcount}
\begin{document}
1\ro, \ordinalnum{1}, 2\ra, \ordinalnum{2}[f]
\end{document}
两次产生数字“1”,后跟上标级脚本大小字母“o”,以及两次数字“2”,后跟上标级脚本大小字母“a”。(我让你猜猜\ordinalnum{2}
如果babel
加载了选项会产生什么english
。)
提醒自己这个babel
包已经存在了很长时间,因此许多babel
语言特定的排版工具都是在 等包出现之前很久就创建的,这很有用fmtcount
。当然,babel
目前人们发现的语言特定异质性远远大于今天以自上而下的方式从头编写包的情况。(旁白:如果portuges
的模块babel
是今天编写的,人们可能也会分别用\def\ro{$^{\rm o}$}
和\def\ra{$^{\rm a}$}
替换\def\ro{\textsuperscript{o}}
和\def\ra{\textsuperscript{a}}
,但那是另一个问题。)
答案2
几种语言定义文件的记录babel
不全。
如果你texdoc babel-portuges
(在终端上或点击链接),你会在最后看到,
尽管 LDF 文件声称最近才修订。我猜这些定义很久以前就被添加了,在babel
历史的开始阶段。几个 LDF 有类似的特别指定各种语言的定义,这确实很麻烦,因为它们可能与用户或包命令冲突。
假设您在英语文档中定义了一个名为\ord
或 的命令\ro
(例如,前者可以用作数学运算符):该命令将正常工作。\usepackage[portuges]{babel}
但是,添加 后,编译将停止:以下文档
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[portuges]{babel}
\usepackage{amsmath}
\DeclareMathOperator{\ord}{ord}
%[...]
会停止
! LaTeX Error: Command \ord already defined.
Or name \end... illegal, see p.192 of the manual.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.6 \DeclareMathOperator{\ord}{ord}
有解决方法吗?请注意,从中删除这些定义会破坏使用、或的portuges.ldf
葡萄牙语现有文档。\ord
\orda
\ro
\ra
但对于你的文档,您可以在特定文档中查找有问题的命令的含义,并决定是否需要。例如,使用\ord
,您可以添加一个解决方法,例如
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[portuges]{babel}
\usepackage{amsmath}
% fix an incompatibility
\let\babelord\ord
\DeclareRobustCommand{\ord}{%
\ifmmode\expandafter\ordop\else\expandafter\babelord\fi
}
\DeclareMathOperator{\ordop}{ord}
%[...]
因为原文\ord
只属于文本模式。
答案3
我通常建议不要使用babel
定义文件中的旧命令。
这标准命令是\textordmasculine
和\textordfeminine
。它们适用于任何语言,并且不需要babel
。
您还可以像平常一样在编辑器中输入字符 ª 和 º。它们适用于任何较新版本的 LaTeX。
所有这些命令都适用于文本模式。如果出于某种原因您想在数学模式下使用它们,则需要将单词括在命令中,例如\textnormal{1º}
。这将切换回文本模式。
在 PDFTeX 的现代版本中,所有这些命令都应默认有效。在较旧的安装中,您可能需要在序言中添加以下几行:
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
在 LuaLaTeX 或 XeLaTeX 上,你希望使用以下方法启用现代字体
\usepackage{fontspec}
其次是\setmainfont
。不过,许多字体包都会为您正确设置编码。
有些字体在这些符号下面有横线,有些则没有,因此请选择一种符合您偏好的字体。如果您想要一个没有下划线的版本,以及一个带有下划线的字体,您可以重新定义
\renewcommand\textordmasculine{\textsuperscript{o}}
\renewcommand\textordfeminine{\textsuperscript{a}}