Как экранировать символ/глиф кавычек?

Как экранировать символ/глиф кавычек?

У меня та же проблема, что и вэтот вопрос, но ответы просто крутятся вокруг того, каклучше всего использовать кавычки. Это нормально, если вы действительно хотите кавычки. Однако я явнонехочу это.

И есть одна законная причина: я хочу отобразить код.Дословно. Без каких-либо изменений. Поэтому я вставляю это в \texttt, или в специальную команду, которую я определил, которая также просто делает это.

МВЭ:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

% you may add magic here to make it ignore/escape any special characters
\newcommand{\inlinecode}{\texttt}

% disable " making strange characters, it breaks our code quotations
% \shorthandoff{"} % does not fully work (see below)

\title{shorthandoff}
\date{August 2020}

\begin{document}

\maketitle

\section{Introduction}

This is a JSON snippet:
\inlinecode{"example\_string\_mentioned": "yes\_no"} \\
\inlinecode{"okay"} \\
\inlinecode{"yikes"}\\
\inlinecode{"ohno"}\\

\end{document}

Это приводит к следующему:

Это фрагмент JSON: ëexample stringmentioned": "yes no"
ökay"
"yikes"
öhno"

Очевидно, это плохо. Очевидно, я не хочу использовать типографически правильные кавычки.

Уже пробовали:

  • Экранировать как {"}(вызвало ошибки отображения и показало ошибки в консоли)¹ или как \"(не помогло).
  • На самом деле побег {e}из example– тоже не сработал.
  • \shorthandoffхорошая рекомендацияиз уже связанного вопросаи помогает. К сожалению, если вы раскомментируете это выше, это все равно будет искажать с e: Мы больше не получаем ökay, но мы получаем ëxample.
  • Этот ответуказали мне на \verb. Хотя это работает, это означает, что я а) не могу больше его вставлять \texttt, он отказывается это делать, и, что еще хуже, б) он предотвращает любые разрывы строк в конце строки.
    Редактировать:Он случайно уже использует шрифт пишущей машинки (той же ширины), что мне нужно в данном случае, но может быть нежелательно в других случаях использования.

¹ На самом деле, похоже, что он принудительно разрывает строку и показывает следующее:

Аргумент \language@active@arg" имеет дополнительный символ }.

По сути, мне просто нужно поведение, похожее на Markdown, для `.

Другими словами: как мнеДействительнопобег "в LaTeX?

TexLive 2019

решение1

Вы можете отключить сокращения локально с помощью \languageshorthands{none}:

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\newcommand{\inlinecode}[1]{{\languageshorthands{none}\ttfamily #1}}

\begin{document}
This is a JSON snippet:
\inlinecode{"example\_string\_mentioned": "yes\_no"} \\
\inlinecode{"okay"} \\
\inlinecode{"yikes"}\\
\inlinecode{"ohno"}
\end{document}

введите описание изображения здесь

решение2

Используйте косвенный метод, который изменяет значение активного параметра ", если он активен; если нет, код не делает ничего вредоносного.

\documentclass{article}
\usepackage[ngerman]{babel}

\newcommand{\inlinecode}{}% just to warn if it is already defined
\DeclareRobustCommand{\inlinecode}{%
  % don't propagate this outside the argument
  \begingroup
  % define the active quote to yield a normal "
  \begingroup\lccode`~=`" \lowercase{\endgroup\edef~}{\string"}%
  % call an auxiliary command to do the typesetting and close the group
  \doinlinecode
}
\newcommand{\doinlinecode}[1]{\texttt{#1}\endgroup}

% disable " making strange characters, it breaks our code quotations
% \shorthandoff{"} % does not fully work (see below)

\title{shorthandoff}
\date{August 2020}

\begin{document}

\maketitle

\section{Introduction}

This is a JSON snippet:
\inlinecode{"example\_string\_mentioned": "yes\_no"} \\
\inlinecode{"okay"} \\
\inlinecode{"yikes"}\\
\inlinecode{"ohno"}

\end{document}

введите описание изображения здесь

решение3

Несмотря на то, что вопрос касается персонажа ", на самом деле речь идет о том, как отобразить встроенный дословный код (JSON).

Стандартный способ включения встроенного дословного текста — использовать \verb, например

In our \textsc{json} we do this with \verb|"otter": 5|.

С помощью дословных символов они отображаются как они есть. Это включает пробелы, что означает, что нет никаких переносов строк. (Кроме того, эти дословные пробелы не растягиваются, как обычные пробелы.)

Другой способ включения кода — использовать пакеты, предназначенные для этого, например listings. Этот пакет включает команды для показа листингов кода, указанных в файле TeX или взятых из внешнего файла, а также для короткого встроенного кода, например:

\documentclass{article}
\usepackage{listings}
\lstset{
  basicstyle=\ttfamily\small,
}
  
\begin{document}
In our \textsc{json} we do this with \lstinline|"otter": 5|.
\end{document}

(Разумеется, настройка basicstyle здесь — это всего лишь пример.)

И здесь, и для \verbразделительного |символа может быть какой-то другой символ. Некоторые популярные варианты — /, +и !, в зависимости от того, что находится в тексте.

Одной из важных функций пакета типа listingsявляется подсветка кода. Однако он не знает о синтаксисе JSON из коробки. Если вы заинтересованы в его настройке (хотя это не было упомянуто в вопросе), вы можете посмотреть, например,этотиэтотвопрос.

А если говорить точнее, то есть возможность разрешить переносы строк. Просто добавьте

  breaklines=true,

в \lstsetнастройки.

Ничего дополнительного вам не нужно делать для прямого "символа, если вы используете обычный шрифт пишущей машинки с вышеизложенным. Но вы обнаружите, что прямой 'символ все равно отображается как закругленная кавычка! Есть пакет, чтобы избежать этого в дословном тексте. Добавьте:

\usepackage{upquote}

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