Como escapar de um caractere/glifo de aspas?

Como escapar de um caractere/glifo de aspas?

Eu tenho o mesmo problema que emessa questão, mas as respostas apenas giram em torno de comomelhor usar aspas. Isso é bom, desde que você realmente queira colocar aspas. No entanto, eu explicitamentenãoeu quero isso.

E há um motivo legítimo: quero exibir o código.Literalmente. Sem qualquer alteração. Então coloquei isso em \texttt, ou em um comando especial que defini que também faz isso.

MWE:

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

Isso resulta nisso:

Este é um snippet JSON: ëexemplo de string mencionada": "yes no"
ökay"
"yikes"
öhno"

Obviamente isso é ruim. Obviamente não quero usar aspas tipograficamente corretas.

Já tentei:

  • Escape como {"}(causou erros de exibição e mostrou erros no console)¹ ou como \"(não ajudou).
  • Na verdade, escapar da {e}entrada exampletambém não funcionou.
  • \shorthandoffé uma boa recomendaçãoda pergunta já vinculadae ajuda. Infelizmente, se você descomentar acima, ele ainda fica confuso com e: Nós não conseguimos ökaymais, mas conseguimos ëxample.
  • Esta respostame indicou \verb. Embora funcione, significa que a) não posso mais inseri-lo \texttt, ele recusa e, pior, b) evita quebras de linha no final da linha.
    Editar:Ele acidentalmente já usa fonte de máquina de escrever (mesma largura), o que eu quero neste caso, mas que pode não ser desejado em outros casos de uso.

¹ Na verdade, parece forçar uma quebra de linha e mostrou o seguinte:

O argumento de \idioma@ativo@arg" possui um } extra.

Basicamente, eu só quero um comportamento semelhante ao Markdown do arquivo `.

Em outras palavras: como faço pararealmenteescapar "em LaTeX?

TexLive 2019

Responder1

Você pode desativar os atalhos localmente com \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}

insira a descrição da imagem aqui

Responder2

Use um método indireto que altere o significado do active ", se estiver ativo; caso contrário, o código não fará nada prejudicial.

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

insira a descrição da imagem aqui

Responder3

Mesmo que a questão se concentre no "personagem, parece realmente ser sobre como exibir o código inline literalmente (JSON).

A maneira padrão de incluir texto literal embutido é com \verb, como

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

Com caracteres literais são mostrados como eles próprios. Isso inclui espaços, o que significa que não há quebras de linha. (Além disso, esses espaços literais não são elásticos como os espaços normais.)

Outra forma de incluir código é usar pacotes destinados a isso, como listings. Esse pacote inclui comandos para mostrar listagens de código fornecidas no arquivo TeX ou retiradas de um arquivo externo, e também para código in-line curto, como este:

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

(É claro que a configuração de estilo básico aqui é apenas um exemplo.)

Tanto aqui quanto para \verbo |caractere delimitador pode haver algum outro caractere. Algumas escolhas populares são /, +e !, dependendo do que está no texto.

Um grande recurso de um pacote como esse listingsé realçar o código. No entanto, ele não conhece a sintaxe JSON imediatamente. Se você estiver interessado em customizar isso (mesmo que não tenha sido mencionado na pergunta), você pode ver, por exemploesseeessepergunta.

Mais especificamente aqui, existe uma opção para permitir quebras de linha. Basta adicionar

  breaklines=true,

para as \lstsetconfigurações.

Não há nada extra que você precise fazer para o "caractere simples se usar uma fonte normal de máquina de escrever com o acima. Mas você descobrirá que o 'caractere reto ainda é mostrado como uma aspa curva! Existe um pacote para evitar isso em texto literal. Adicionar:

\usepackage{upquote}

informação relacionada