lstling内の一部の文字がpdf上で前の文字と入れ替わる(Xelatex)。

lstling内の一部の文字がpdf上で前の文字と入れ替わる(Xelatex)。

- 名前 任意 の投稿
返信数: 2
lstlisting環境内で、添字f₁や矢印↔を書き込むと、その文字がPDFで表示される順番が変わってしまいます。文字間にスペースを挿入することでこの問題を回避できますが、順番が入れ替わらないようにする方法があるかどうか、ご存知でしょうか。よろしくお願いします。
 
以下がコードです。
 

¥documentclass{article}
¥usepackage{verbatim}
¥usepackage{fontspec}
¥usepackage[utf8]{inputenc}
%特殊文字用のフォント
¥setmonofont{FiraCode-Regular.ttf}[Contextuals={Alternate}]

¥usepackage{listings}

¥lstdefinelanguage{test} {
  keepspaces=true,
  basicstyle=¥ttfamily,
  mathescape,
  literate=
  {↔}{$¥ensuremath{¥leftrightarrow}$}{1}
  {₁}{$¥ensuremath{_1}$}{1}
}

¥begin{document}
Without listings (verbatim):
¥begin{verbatim}
  ∀x ∈ ℝ, (f₁ x = f₂ x) → f₁ = f₂
¥end{verbatim}

With listings:
¥begin{lstlisting}[language=test]
  ∀x ∈ ℝ, (f₁ x = f₂ x) → f₁ = f₂
¥end{lstlisting}

Without listings (verbatim):
¥begin{verbatim}
  (P↔Q)
¥end{verbatim}

With listings:
¥begin{lstlisting}[language=test]
  (P↔Q)
¥end{lstlisting}

¥end{document}

上のコードがpdf上で以下のようにコンパイルされます。添え字の₁や₂、矢印の↔が前の文字と入れ替わっています:

Without listings (verbatim):

∀x ∈ R, (f₁ x = f₂ x) → f₁ = f₂

With listings:

∀x ∈ R, (₁f x = ₂f x) → ₁f = ₂f

Without listings (verbatim):

(P↔Q)

With listings:

(↔PQ)

名前 任意 への返信

Re: lstling内の一部の文字がpdf上で前の文字と入れ替わる(Xelatex)。

- はやて (h20y6m) の投稿
https://tex.stackexchange.com/questions/25391/the-listings-package-and-utf-8 が参考になるでしょうか?

\makeatletter
\lst@InputCatcodes
\def\lst@DefEC{%
\lst@CCECUse \lst@ProcessLetter
  ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
  % (省略)
  ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
  % 使いたい文字を並べる
  ↔₁₂%
  ^^00}
\lst@RestoreCatcodes
\makeatother