Я хочу набрать выражение Паскаля
(chr='A') and (num=3)
в MathJax, где число, круглые скобки, знаки равенства и логический оператор «и» отображаются в виде математических символов, а остальное — шрифтом пишущей машинки. Для этого я использую команды TeX \hbox
и \tt
.
.a mjx-c.mjx-c2019::before {
content: "\27" !important;
padding-right: 0.525em !important;
font-family: MJXZERO, MJXTEX-T;
}
<script src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type = "text/javascript"></script>
Correct: <span class = "math a">\[({\tt chr}=\hbox{\tt 'A'})\land
({\tt num}=3)\]</span>
Wrong: <span class = "math b">\[({\tt chr}=\hbox{\tt 'A'})\land
({\tt num}=3)\]</span>
Without \hbox: <span class = "math c">\[({\tt chr} = {\tt 'A'})\land
({\tt num}=3)\]</span>
Это работает, но мне нужен загадочный стиль CSS, чтобы одинарные кавычки выводились шрифтом пишущей машинки. Без \hbox
одинарные кавычки отображаются как другой символ.
Другие символы внутри {\tt ...}
правильно отображаются шрифтом пишущей машинки. Почему одинарные кавычки обрабатываются по-разному?
Во-первых, если вы используете CSS для изменения размера символов, используемых MathJax, он больше не будет знать размер выражения и может неправильно получить такие вещи, как дроби, корни, фигурные скобки и т. д. Так что не стоит этого делать.
Есть несколько способов решить проблему. Во-первых, проблема вызвана расширением textmacros
, которое используется для обработки макросов в текстовом режиме. В TeX символы `
и '
используются для формирования «умных кавычек», таких как ‘
и ’
или “
и ”
, а поскольку шрифты MathJax основаны на Юникоде, MathJax превращает `
и '
в их версии для Юникода, U+2018 ( ‘
) и U+2019 (’
), а пары ``
и ''
— в U+201C (“
) и U+201D (”
). В шрифтах MathJax моноширинный шрифт не включает эти символы смарт-кавычек, поэтому для них используется обычный вариант. Вот почему вы видите немоноширинную версию. (В вашем последнем примере выражение находится в математическом режиме, а не в текстовом режиме, поэтому '
интерпретируется как ^\prime
, поскольку \tt
применяется только к буквам и цифрам в математическом режиме. Таким образом, вы получаете простой символ. Это верно как в MathJax, так и в реальном TeX.)
Поэтому одно из возможных решений — не использовать расширение textmacros
, чтобы символы в текстовом режиме воспринимались дословно. Вы можете сделать это, как в следующем примере:
<script>
MathJax = {
tex: {
packages: {'[-]': ['textmacros']}
}
}
</script>
<script src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type = "text/javascript"></script>
\[(\texttt{chr}=\texttt{'A'})\land (\texttt{num}=3)\]
Обратите внимание, что я использовал \texttt{...}
, чтобы получить моноширинный шрифт в текстовом режиме, и это правильный способ сделать это. Ваш {\tt ...}
находится в математическом режиме, и без textmacros
\hbox{\tt ...}
не будет обрабатывать \tt
, поскольку в текстовом режиме ничего не обрабатывается.
Если вы хотите продолжать использовать расширение textmacros
, решением будет определить необходимые символы U+2019 и U+201D. Вот один из способов сделать это:
<script>
MathJax = {
startup: {
ready() {
MathJax.startup.defaultReady();
const jax = MathJax.startup.document.outputJax;
const chars = jax.font.variant.monospace.chars;
chars[0x2019] = [.611, -.287, .525, {f: "T", c: "'"}];
chars[0x201D] = [.611, -.287, 1.05, {f: "T", c: "''"}];
}
}
}
</script>
<script src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type = "text/javascript"></script>
\[(\texttt{chr}=\texttt{'A'})\land (\texttt{num}=3)\]
Вы можете сделать что-то подобное для U+2018 и U+201C, если они вам нужны.