リスト内で二重引用符を正しく取得するにはどうすればよいですか?

リスト内で二重引用符を正しく取得するにはどうすればよいですか?

私の質問は次の2つに関連しています

しかし、私は特に二重引用符文字 (ASCII 10 進コード 34) について尋ねています。リストでは二重引用符が波型で表示されます。代わりに、まっすぐな二重引用符を取得するにはどうすればよいでしょうか?

MWE:

\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}必要ないことに注意してください。upquotetextcomplistingsupquotetrue

ここに画像の説明を入力してください

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

答え2

私にとって、上記の解決策は機能しませんでした。

主な問題は、 の 922 行目から 943 行目にありますlistings.sty。ここでは、特殊文字を処理するディスパッチ テーブルが作成されますが、アップクォートは単一引用符に対してのみ実行されます。

これを修正するには、プリアンブルに次の内容を追加します。

\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

二重引用符が波型として表示される理由の1つは、TeX合字の使用です。これはすでにAthanasiusOfAlex の回答私が発見したように、これらの合字を(しばしば意図せずに)有効にする方法の1つは、次のような行を使用することです。

\defaultfontfeatures{Ligatures=TeX}

この行はTeX合字が有効になっていることを保証します。全てフォント(その後 を使用して定義される等幅フォントを含む)です\setmonofont。これにより、リストに中括弧が表示されますが、これは他のどの回答を使用しても解決できません。

そのような行がある場合は削除してください。パッケージでは、コマンドとコマンドに対してfontspecTeX合字がデフォルトで有効になっています。これは、おそらく、\setmainfont\setsansfontする合字が欲しい。(これは、パッケージドキュメント

コード リストに em ダッシュ (例) を入力する場合は、3 つのハイフンを入力する代わりに、実際の Unicode シンボル ( )を使用します---

関連情報