
この単純なファイルは、英語ではエラーが表示され、ポルトガル語では問題なくコンパイルされます。
\documentclass{report}
\usepackage[english]{babel}
%\usepackage[portuges]{babel}
\begin{document}
\ro
\end{document}
なぜ は\ro
1 つの言語では定義されていて、他の言語では定義されていないのでしょうか? ポルトガル語で何が定義されているかはどうすればわかりますか ? 他にはどのようなコマンドがこのように定義されていますか? Babel マニュアルには\ro
に関する記述がありません。\ro
答え1
ポルトガル語でtoが何と定義されているかを知るにはどうすればいいでしょうか
\ro
?
コマンドがどのように定義されているかを確認するには、 を使用します\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 入力表記法を使用すると、省略形では as と書かれると思います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」(「4回目」)は と省略できますa 4\ra~vez
。
なぜ
\ro
一方の言語では定義されていて、もう一方の言語では定義されていないのでしょうか?
うーん、タイポグラフィのニーズは言語によって異なるからでしょうか?
確かに、英語の組版では、 や\ro
マクロは明らかに必要ありません\ra
。「First、second、third」は絶対にありません英語の文書のように省略形で書かれています1\textsuperscript{o}, 2\textsuperscript{o}, 3\textsuperscript{o}
。さらに、英語には男性序数と女性序数(ましてや中性序数)の区別がありません。
序数の組版を簡素化し標準化するLaTeXパッケージはいくつかある。そのようなパッケージの1つはニコラ・タルボットの フレーム数は、マクロを提供し\ordinalnum
、多数の言語固有の適応機能を備えています。(余談ですが、このfmtcount
パッケージはマクロ以外にも多くの機能を提供していますordinalnum
...)確かに、
\documentclass[portuguese]{report}
\usepackage{babel,fmtcount}
\begin{document}
1\ro, \ordinalnum{1}, 2\ra, \ordinalnum{2}[f]
\end{document}
を 2 回実行すると、数字の「1」に続いて上付き文字レベルの文字サイズの文字「o」が生成され、さらに、数字の「2」が 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}}