Babel - Разница между языками

Babel - Разница между языками

Этот простой файл, который показывает ошибку на английском языке и прекрасно компилируется на португальском языке:

\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}}

Связанный контент