Вавилон - Разница между языками

Sep 18 2020

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

\documentclass{report}

\usepackage[english]{babel}
%\usepackage[portuges]{babel}

\begin{document}
\ro
\end{document}

Почему \roследует определять на одном языке, а не на другом? Как узнать, что означает \roв португальском языке? Какие еще команды определены таким образом? В \roруководстве Babel нет упоминания о нем .

Ответы

4 Mico Sep 19 2020 at 06:39

Как узнать, что означает \roв португальском языке?

Чтобы узнать, как определяется команда, используйте \show. Запустив \show\roи просмотрев файл журнала, можно найти:

> \ro=macro:
->$^{\rm o}$.
l.8 \show\ro

Это говорит о том, что (а) \roэто макрос, а не примитив TeX; (б) его определение сводится к ; и (c) предполагается, что он будет использоваться в текстовом режиме, а не в математическом.\def\ro{$^{\rm o}$}

Я не специалист по португальскому языку, но считаю, что «первый, второй, третий» пишется в длинной форме как «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 4\ra~vez.

Почему должно \roбыть определено на одном языке, а не на другом?

Эммм, потому что типографские потребности в разных языках различаются?

Конечно, в англоязычном наборе нет явной необходимости ни в, \roни в \raмакросе. «Первое, второе, третье» определенно не пишется в сокращенной форме, как 1\textsuperscript{o}, 2\textsuperscript{o}, 3\textsuperscript{o}в англоязычном документе. Более того, в английском языке нет различия между мужским и женским (не говоря уже о нейтральном!) Ординалах.

Есть несколько пакетов LaTeX, которые упрощают и стандартизируют набор порядковых номеров. Одним из таких пакетов является fmtcount Никола Талбот , который предоставляет макрос и содержит большое количество языковых адаптаций. (В сторону: пакет предоставляет много других возможностей помимо макроса ...) Конечно же,\ordinalnumfmtcountordinalnum

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

3 egreg Sep 19 2020 at 10:09

Некоторые файлы определений языков 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 Davislor Sep 19 2020 at 08:51

Я бы вообще не рекомендовал использовать устаревшие команды из 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}}