Minha pergunta está relacionada aos dois seguintes
- Como ter aspas simples retas em lstlistings
- No pacote cunhado, como faço para aplicar aspas simples diretas?
mas estou perguntando especificamente sobre aspas duplas (código decimal ASCII 34). Eles aparecem encaracolados em minhas listagens. Como posso obter aspas duplas diretas?
MWE:
\documentclass{article}
\usepackage{textcomp,upquote,listings}
\lstset{upquote=true}
\begin{document}
\begin{lstlisting}
echo "Hello, world!"
\end{lstlisting}
\end{document}
produz
Entendo que o upquote
pacote se aplica apenas a aspas simples. Como posso aplicá-lo também a aspas duplas?
Responder1
Basta adicionar \usepackage[T1]{fontenc}
ao seu preâmbulo. Observe que você não precisa do upquote
pacote se carregar textcomp
e definir listings
' upquote
key como true
.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{listings}
\lstset{upquote=true}
\begin{document}
\begin{lstlisting}
echo "Hello, world!"
\end{lstlisting}
\end{document}
Responder2
Para mim, as soluções acima não funcionaram.
O principal problema pode ser visto nas listings.sty
linhas 922-943, onde é criada uma tabela de despacho para tratamento de caracteres especiais, mas o upquote só é feito para aspas simples.
Pode-se corrigir isso adicionando o seguinte ao seu preâmbulo:
\usepackage{listings}
\lstset{upquote=true}
% ...
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"22}{\lst@ifupquote \textquotedbl
\else \char34\relax \fi}
\@empty\z@\@empty
\makeatother
% ...
qual macaco corrige aquela tabela.
Emptor de advertência: este é um hack terrível que depende da modificação de macros internas do pacote de listagens. Isso pode falhar de forma arbitrária e completa e pode até não funcionar na sua distribuição TeX.
Responder3
Se você estiver usando XeLaTeX e quiser alterar a fonte (digamos, para usar a fonte padrão da máquina de escrever), use o fontspec
pacote para desligar as ligaduras TeX, como segue:
% !TEX TS-program = xelatex
% !TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{fontspec}
\usepackage{listings}
\lstset{basicstyle=\ttfamily\addfontfeature{Mapping=no-mapping-ligtex}}
\begin{document}
\begin{lstlisting}
echo "Hello, world!"
\end{lstlisting}
\end{document}
Responder4
Uma possível razão para as aspas duplas aparecerem como curvas é o uso de ligaduras TeX - isso já foi mencionado emResposta de AthanasiusOfAlex. Como descobri, uma maneira pela qual essas ligaduras podem ser habilitadas (muitas vezes inadvertidamente) é através do uso de uma linha como
\defaultfontfeatures{Ligatures=TeX}
Esta linha garante que as ligaduras TeX estejam habilitadas paratodosfontes, incluindo quaisquer fontes monoespaçadas definidas posteriormente usando \setmonofont
. Isso leva a aspas curvas nas listagens que não puderam ser resolvidas usando nenhuma das outras respostas.
Se você tem essa linha, livre-se dela. O fontspec
pacote já habilita ligaduras TeX por padrão para os comandos \setmainfont
e \setsansfont
, que provavelmente correspondem às fontes onde vocêfazerquero as ligaduras. (Isso é mencionado na Parte II, Seção 1 dodocumentação do pacote.)
Se você quiser digitar um travessão (por exemplo) na listagem de código, basta usar o símbolo Unicode real para ele ( —
) em vez de digitar três hífens ---
.