我必须在 listing 包中使用 unicode char,但是以下示例中报告了错误:
! Package inputenc Error: Invalid UTF-8 byte "94.
如何解决此错误:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{listings}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usetikzlibrary{fit,calc}
\newcounter{T}
\newcommand\makenode[2]{%
\tikz[baseline=0pt, remember picture] {
\node[anchor=base,#1/.try] (m-\the\value{T}) {#2};}%
%\node[fill=red!10,label=\the\value{T},anchor=base,#1/.try] (m-\the\value{T}) {#2}; }%
\stepcounter{T}%
}
\lstdefinelanguage{myLang}{
alsoletter=0123456789\+\=\*\/<(){};\,
}
\lstset{
identifierstyle=\makenode{identifier},
inputencoding = utf8, % Input encoding
extendedchars = true, % Extended ASCII
}
\lstset{label= ,caption= ,captionpos=b,numbers=left}
\begin{document}
\begin{lstlisting}[language=myLang, numbers=none, escapechar=!,
basicstyle=\ttfamily\bfseries, linewidth=0.82\linewidth]
└── rootdir
├── product
│ ├── app
│ ├── etc
│ └── priv-app
├── system
│ ├── app
│ ├── etc
│ └── priv-app
└── vendor
├── app
├── etc
└── priv-app
\end{lstlisting}
\begin{tikzpicture}[remember picture, overlay,
every edge/.append style = {->, thick, >=latex,
line width = 1pt },
box/.style = {align=center, minimum height = 0pt,inner sep=0,
font = \bfseries},
text width = 2.5cm ]
\node[box,fit=(m-4)(m-6), draw] {};
\foreach \x/\y in {18/6,21/9,25/13,18/29,21/31,25/34} {
\draw[-latex] (m-\x) ..controls ([xshift=2cm]m-\x) (m-\y);
}
\end{tikzpicture}
\end{document}
答案1
据我所知,该包listings
不支持 8 位 TeX 引擎的多字节编码。解决方法:
listingsutf8
如果 UTF-8 字符可以转换为 LaTeX 支持的 8 位编码,则可以使用包作为解决方法。如果环境lstlistings
不受支持,则内容将进入单独的文件,该文件由\lstinputlisting
正确的编码选项读取。然后包会listingsutf8
自动将文件转换为包listings
。方框绘图字符使问题变得复杂,因为代码页 437 中有这些字符,但是却
cp437.def
遗漏了它们。但也许还有更简单的方法。
pmboxdraw
如果您没有字体.dfu
为 LaTeX 的 UTF-8 支持提供文件,则包会提供这些字符。如果您不需要listings
此“ASCII 艺术”的包功能,那么一些逐字环境将起作用(普通verbatim
、包verbatim
、alltt
具有更好的转义支持的包,...)。
例子:
\documentclass{article}% standalone does not work in this case
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[variablett]{lmodern}% with proportional type writer font
\usepackage{pmboxdraw}
\usepackage{alltt}
\begin{document}
\begin{alltt}
└── rootdir
├── product
│ ├── app
│ ├── etc
│ └── priv-app
├── system
│ ├── app
│ ├── etc
│ └── priv-app
└── vendor
├── app
├── etc
└── priv-app
\end{alltt}
\end{document}
答案2
所以,我遇到了同样的问题。一个选项是使用\begin{verbatim}
,但我真的很想自定义我的列表,例如使用标题。所以我所做的是\usepackage{pmboxdraw}
在列表中添加和literate= ...
。示例:
\documentclass{article}% standalone does not work in this case
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{caption}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{pmboxdraw}
\begin{document}
\begin{lstlisting}[language=myLang, caption=myCaption, label=lst:myLabel, numbers=none, escapechar=!, basicstyle=\ttfamily\bfseries, linewidth=0.82\linewidth,literate = {├}{{\textSFviii}}1 {─}{{\textSFx}}1 {└}{{\textSFii}}1 {│}{{\textSFxi}}1]
└── rootdir
├── product
│ ├── app
│ ├── etc
│ └── priv-app
├── system
│ ├── app
│ ├── etc
│ └── priv-app
└── vendor
├── app
├── etc
└── priv-app
\end{lstlisting}
所有符号均可在此处找到:https://ctan.mirror.norbert-ruehl.de/macros/latex/contrib/pmboxdraw/pmboxdraw.pdf