列出被 XeLaTeX 忽略的文字字符

列出被 XeLaTeX 忽略的文字字符

我需要使用\textvisiblespace角色代码清单中的 Mac 命令 splat (⌘),与环境lstlisting\lstinputlisting来自外部文件一起使用。我使用包\cmd中的宏menukeys来获取 splat。

使用下面的 MWE,它可以在 pdflatex 中工作,但在 XeLaTeX 中它会忽略literate=参数\lstset并尝试在字体中找到 ⌘ 和 ␣。

我究竟做错了什么?

\documentclass{article}
%%%%%%%%%%%%%%%%%%%%%%%%% either these two lines:
%\usepackage{fontspec}
%\usepackage{libertine} % or any other font
%%%%%%%%%%%%%%%%%%%%%%%%% or these two lines:
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{listings}
\usepackage{menukeys}
\lstset{extendedchars=true,
  literate={⌘}{{\cmd}}1{␣}{{\textvisiblespace}}1,
  showstringspaces=false,
  columns=fullflexible,
  keepspaces=true}
\lstloadlanguages{XML,[LaTeX]TeX}
\begin{document}
Here is a listing:
\begin{lstlisting}[language=TeX]
Mac␣users press ⌘-C
\end{lstlisting}
Here is a listing from a file:
\lstinputlisting{foobar.sh}
\end{document}

外部文件 foobar.sh 说:

Mac␣users press ⌘-C

在 pdflatex 中,它可以正确获取字符,但会发出错误:

! Package tikz Error: Sorry, some package has redefined the meaning of the math
-mode dollar sign. This is incompatible with tikz and its calc library 
and might cause unrecoverable errors.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.18 Mac␣users press ⌘
                          -C

在 XeLaTeX(使用 Libertine 字体)中,它会错放可见空间(要么在环境版本中行的左侧,要么在文件输入的版本中代码上方的行上),并且它会为 splat 打印“未知字符”(带有 X 的方块)。使用 plex-serif 字体包,我得到了两个字符的粗垂直线和日志文件中的错误消息(对 splat 重复):

Missing character: There is no ␣ in font [IBMPlexSerif-Regular.otf]/OT:script=l
atn;language=DFLT;mapping=tex-text;mapping=tex-text;!

省略字体(即使用 CM),我得到了与 Libertine 类似的结果,但是 splat 中没有任何字符。

答案1

您问了两个问题:如何\cmd在列表内使用,以及如何在 xelatex 中使用非 ascii 字符。

对于第一个,您应该在本地重置 $ 的 catcode。对于第二个,您需要将非 ASCII 字符添加到列表的解析列表中(另请参阅'listings' 包和 UTF-8

\documentclass{article}
%%%%%%%%%%%%%%%%%%%%%%%%% either these two lines:
%\usepackage{fontspec}
%\usepackage{libertine} % or any other font
%%%%%%%%%%%%%%%%%%%%%%%%% or these two lines:
%\usepackage[utf8]{inputenc}
%\usepackage[T1]{fontenc}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{listings}
\usepackage{menukeys}

\makeatletter %for xelatex:
\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%
  ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
  ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
  ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
  ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
  ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
  ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
  ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
  ^^^^2318^^^^2423% for xelatex
  ^^00}
\lst@RestoreCatcodes
%\makeatother

\lstset{extendedchars=true,
  literate={⌘}{{\catcode`\$=3 \cmd}}1{␣}{{\textvisiblespace}}1,
  showstringspaces=false,
  columns=fullflexible,
  keepspaces=true}
\lstloadlanguages{XML,[LaTeX]TeX}
\begin{document}
Here is a listing:
\begin{lstlisting}[language=TeX]
Mac␣users press ⌘-C
\end{lstlisting}

Here is a listing from a file:
%\lstinputlisting{foobar.sh}
\end{document}

在此处输入图片描述

相关内容