Мой вопрос связан со следующими двумя
- Как использовать прямые одинарные кавычки в lstlistings
- Как в пакете minted принудительно использовать прямые одинарные кавычки?
но я конкретно спрашиваю о символах двойных кавычек (десятичный код ASCII 34). Они отображаются в моих листингах фигурными. Как мне получить прямые двойные кавычки вместо них?
МВЭ:
\documentclass{article}
\usepackage{textcomp,upquote,listings}
\lstset{upquote=true}
\begin{document}
\begin{lstlisting}
echo "Hello, world!"
\end{lstlisting}
\end{document}
производит
Я понимаю, что upquote
пакет применяется только к одинарным кавычкам. Как сделать так, чтобы он применялся и к двойным кавычкам?
решение1
Просто добавьте \usepackage[T1]{fontenc}
в преамбулу. Обратите внимание, что вам не нужен пакет, upquote
если вы загрузите textcomp
и установите listings
' upquote
key в true
.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{listings}
\lstset{upquote=true}
\begin{document}
\begin{lstlisting}
echo "Hello, world!"
\end{lstlisting}
\end{document}
решение2
Лично мне вышеуказанные решения не помогли.
Основная проблема видна в listings.sty
строках 922–943, где создана таблица обработки специальных символов, но апкавычки выполняются только для одинарных кавычек.
Это можно исправить, добавив в преамбулу следующее:
\usepackage{listings}
\lstset{upquote=true}
% ...
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"22}{\lst@ifupquote \textquotedbl
\else \char34\relax \fi}
\@empty\z@\@empty
\makeatother
% ...
которая обезьяна-патчит эту таблицу.
Пусть покупатель будет бдителен: это ужасный хак, который основан на изменении внутренних макросов пакета листингов. Это может произвольно и полностью сломаться и даже не работать на вашем дистрибутиве TeX.
решение3
Если вы используете XeLaTeX и хотите изменить шрифт (например, использовать шрифт пишущей машинки по умолчанию), используйте пакет fontspec
для отключения лигатур TeX следующим образом:
% !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}
решение4
Одной из возможных причин отображения двойных кавычек в виде фигурных скобок является использование лигатур TeX — об этом уже упоминалось вОтвет AthanasiusOfAlex. Как я обнаружил, один из способов, которым эти лигатуры могут быть (часто непреднамеренно) включены, — это использование такой строки, как
\defaultfontfeatures{Ligatures=TeX}
Эта строка гарантирует, что лигатуры TeX включены длявсешрифты, включая любые моноширинные шрифты, впоследствии определенные с помощью \setmonofont
. Это затем приводит к фигурным кавычкам в листингах, которые не могут быть решены с помощью любого из других ответов.
Если у вас есть такая строка, избавьтесь от нее. Пакет fontspec
уже включает лигатуры TeX по умолчанию для команд \setmainfont
и \setsansfont
, которые, вероятно, соответствуют шрифтам, где выделатьнужны лигатуры. (Это упоминается в Части II, Разделе 1пакет документации.)
Если затем вы захотите ввести длинное тире (например) в листинге кода, просто используйте для него фактический символ Unicode ( —
) вместо ввода трех дефисов ---
.