嗯,说实话这是我见过的有关 LaTeX 的最奇怪的事情。
我的一个朋友遇到了一个我只能描述为错误的问题listings
;它可以解决吗?
请参阅下面带有错误的最小示例。
\documentclass{article}
\usepackage{listings}
\lstMakeShortInline[language=Python]"
\begin{document}
"ThisIsAFakeError".
"ThisIsAFakeErro".
\end{document}
错误信息:
ERROR: Missing } inserted.
--- TeX said ---
<inserted text>
}
l.8 "ThisIsAFakeError".
--- HELP ---
TeX has become confused. The position indicated by the error locator
is probably beyond the point where the incorrect input is.
ERROR: Undefined control sequence.
--- TeX said ---
\lst@eaten ->".
l.8 "ThisIsAFakeError".
--- HELP ---
TeX encountered an unknown command name. You probably misspelled the
name. If this message occurs when a LaTeX command is being processed,
the command is probably in the wrong place---for example, the error
can be produced by an \item command that's not inside a list-making
environment. The error can also be caused by a missing \documentclass
command.
答案1
通过比较"Ej"
(有效)和"Er"
(无效)\tracingall
可以发现这里出了问题
\lst@IfNextChars@@ #1#2\relax #3->\def \lst@tofind {#2}\lst@lAddTo \lst@eaten {
#3}\ifx #1#3\ifx \lst@tofind \@empty \let \lst@next \@tempa \else \let \lst@nex
t \lst@IfNextChars@ \fi \expandafter \lst@next \else \expandafter \@tempb \fi
#1<-"
#2<-""
#3<-"
其中"
被用作分隔标记和被测试的标记......
解决方法是使用其他方法,例如^
\documentclass{article}
\usepackage{listings}
\lstMakeShortInline[language=Python]^
\begin{document}
^ThisIsAFakeError^.
^ThisIsAFakeErro^.
\end{document}
答案2
如果“你的朋友”(是的! )在文件中:p
查找该Python
语言的定义listings
列表文件,“他/她”将看到该"
字符被定义为该语言的字符串分隔符:
morestring=[b]",%
因此,当“你的朋友”试图将该字符定义为内联 Python 代码的简写时,TeX 会感到困惑也就不足为奇了。一个字符不能同时充当内联代码的简写和分隔符,因为listings
无法知道该字符的给定出现应该实现哪种功能。
您应该告诉“您的朋友”选择一个不太可能出现在 Python 代码中的字符,例如反引号。有关错误的具体信息,请参阅 David 的回答。