
Я знаю несколько способов исправить это (например \usepackage[T1]{fontenc}
, ), но я хочу понять, что происходит в следующем примере.
\documentclass{article}
\begin{document}
\noindent
\$ \% \& \{ \} \_ \# \textbackslash \\
\ttfamily \$ \% \& \{ \} \_ \# \textbackslash \\
\verb+$ % & { } _ # \ +
\end{document}
Почему попытка получить
\ttfamily
фигурную скобку, подчеркивание или обратную косую черту приводит к замене обычного римского символа? Глифы явно не отсутствуют, поскольку режим verbatim может получить к ним доступ.Как именно режим дословного перевода получает доступ к этим глифам?
Удаление скобок и обратной косой черты, так что единственным оставшимся «проблемным» символом остается подчеркивание, устраняет предупреждения шрифта, несмотря на то, что замена все еще происходит. Почему так?
решение1
\verb
и verbatim
предположим, что шрифт содержит эти символы в их позициях ascii и локально присваивает символам код 12 (как знакам препинания) без специального определения.
\textbackslash
(и друзья) определяется как команда, зависящая от кодировки, и (чтобы создать видимость здравомыслия по сравнению с исходными кодировками TeX) LaTeX предполагает, что OT1
кодировка — это кодировка, в cmr10
которой нет символа обратной косой черты. Поэтому в OT
определении по умолчанию используется (использующее математические шрифты). \ttfamily
изменяет семейство, но не кодировку, и поэтому в этом случае вы получаете определение OT1, хотя шрифт cmtt
на самом деле закодирован по-другому.
В , все работает лучше, T1
поскольку шрифты, помеченные как закодированные T1, на самом деле имеют ту же кодировку.
\_
отличается тем, что \textunderscore
имеет определение по умолчанию, которое вообще не использует шрифт, а использует горизонтальную линейку.