Являются ли одинарные кавычки особенными, когда они встречаются в шрифте пишущей машинки?

Я хочу набрать выражение Паскаля

(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 ...} правильно отображаются шрифтом пишущей машинки. Почему одинарные кавычки обрабатываются по-разному?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, если вы используете 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, если они вам нужны.

Другие вопросы по теме