
這個簡單的檔案在英語中顯示錯誤並在葡萄牙語中編譯得很好:
\documentclass{report}
\usepackage[english]{babel}
%\usepackage[portuges]{babel}
\begin{document}
\ro
\end{document}
為什麼要用\ro
一種語言定義而不用另一種語言定義?如何找出 \ro
葡萄牙語中「to」的定義?還有哪些命令是這樣定義的?\ro
Babel 手冊中沒有提及。
答案1
如何找出
\ro
葡萄牙語中「to」的定義?
若要了解指令的定義方式,請使用\show
.運行\show\ro
並查看日誌文件,發現:
> \ro=macro:
->$^{\rm o}$.
l.8 \show\ro
這說明 (a)\ro
是一個宏,而不是一個 TeX 原語; (b) 其定義歸結為\def\ro{$^{\rm o}$}
: (c) 它應該用於文字模式,而不是數學模式。
我不是葡萄牙語專家,但我相信“第一,第二,第三”以長形式寫為“primeiro,segundo,terceiro”,並使用 LaTeX/babel 輸入符號,如1\ro, 2\ro, 3\ro
速記形式。鑑於上面顯示的定義\ro
,我會讓您猜測 的輸出是什麼樣1\ro, 2\ro, 3\ro
的。
顯然,\ro
它旨在用於將基數“轉換”(在印刷意義上!)為序數。請注意,雖然 while\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
or 的指令\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}}