Как использовать прямые двойные кавычки в листингах?

Как использовать прямые двойные кавычки в листингах?

Мой вопрос связан со следующими двумя

но я конкретно спрашиваю о символах двойных кавычек (десятичный код ASCII 34). Они отображаются в моих листингах фигурными. Как мне получить прямые двойные кавычки вместо них?

МВЭ:

\documentclass{article}
\usepackage{textcomp,upquote,listings}
\lstset{upquote=true}
\begin{document}
\begin{lstlisting}
echo "Hello, world!"
\end{lstlisting}
\end{document}

производит

Вывод предоставленного MWE; содержит закрывающие фигурные кавычки

Я понимаю, что upquoteпакет применяется только к одинарным кавычкам. Как сделать так, чтобы он применялся и к двойным кавычкам?

решение1

Просто добавьте \usepackage[T1]{fontenc}в преамбулу. Обратите внимание, что вам не нужен пакет, upquoteесли вы загрузите textcompи установите listings' upquotekey в 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 ( ) вместо ввода трех дефисов ---.

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