
Этот простой файл, который показывает ошибку на английском языке и прекрасно компилируется на португальском языке:
\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
. "First, second, third" — этоточно нетнаписано в сокращенной форме, как 1\textsuperscript{o}, 2\textsuperscript{o}, 3\textsuperscript{o}
в документе на английском языке. Более того, в английском языке нет различия между мужским и женским (не говоря уже о нейтральном!) порядковыми числительными.
Существует несколько пакетов LaTeX, которые упрощают и стандартизируют набор порядковых числительных. Один из таких пакетов —Никола Тэлбот fmtcount, который предоставляет макрос \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
Но длятвойdocument, вы можете посмотреть в конкретном документе, что означает команда-нарушитель, и решить, нужно ли вам это или нет. Например, с помощью \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
файлов определений.
Theстандартные команды для этогоесть \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}}