我回答了这个问题楼主向我展示了答案中的一个问题。代码如下:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\lstset{
% keepspaces, % Apparently this works...
literate=
{à}{{\`a}}1
}
\begin{document}
\begin{lstlisting}[mathescape=true]
Adicionar v à lista.
Adicionar $v$ à lista.
Adicionar $v$ onde?
R: à lista.
Yoda style: à lista, $v$ adicionar.
Adicionar $v$ à lista e à outra lista.
\end{lstlisting}
\end{document}
印刷:
并且后面的空格à
被吃掉了。
从上面的四个例子中,我得出结论,问题出在d 文本literate
后行中的第一个 d 字符处。mathescape
- 第二行和第六行显示了这个问题。
- 第四行表明第三行的效果在换行后停止。
- 第五行表示效果仅在
mathescape
d 文本之后开始 - 第六行表明问题不会蔓延到接下来的
literate
d 个字符。
使用该keepspaces
选项显然可以解决问题。
从外表来看思考这是一个错误。如何修复?
我还得出结论,这v
肯定被添加到列表中:)
答案1
(2018 年 8 月 12 日——今天是星期天,我没有勇气深入探讨源代码列表包裹。
但在浏览源代码时,我得到的印象是
通过密钥提供的内容的替换过程背后的宏
literate
被称为\lst@Literate
。有一个开关
\lst@ifwhitespace
,它指示最后处理的东西是否是作为空白打印的空格。的代码
\lst@Escape
—\lst@Escape
似乎是所有那些用于转义为 LaTeX 的东西的基础 — 确实在被使用时将该开关设置为 false,因为该开关为mathescape
true。所以mathescape=true
在 之后的开关为 false$...$
。这导致将后面的空格处理$...$
为空白,这些空白不会被丢弃,而是会被打印出来。对下一个空格的这种处理反过来又导致将开关再次设置为 true。现在,文字的东西被处理了。底层宏\lst@Literate
不会将开关设置为 false。因此,由于文字的东西之前的空格被处理为打印的空白,处理文字的东西后的“机器”仍然“认为”它刚刚处理并打印了一个空白,因此应该丢弃后面的空格。
当文学作品的最后一项输出产生了除空格之外的其他东西时,这种机器的“思考”似乎是错误的。
关于这个还能做什么?
也许\lst@Literate
应该重新定义以将该开关设置为false。
可能看起来像这样:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\lstset{
literate=
{à}{{\`a}}1
}
\makeatletter
\def\lst@Literate#1#2#3{%
\ifx\relax#2\@empty\else
\lst@CArgX #1\relax\lst@CDef
{}
{\let\lst@next\@empty
\lst@ifxliterate
\lst@ifmode \let\lst@next\lst@CArgEmpty \fi
\fi
\ifx\lst@next\@empty
\ifx\lst@OutputBox\@gobble\else
\lst@XPrintToken \let\lst@scanmode\lst@scan@m
\lst@token{#2}\lst@length#3\relax
\lst@XPrintToken
\lst@whitespacefalse %!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
\fi
\let\lst@next\lst@CArgEmptyGobble
\fi
\lst@next}%
\@empty
\expandafter\lst@Literate
\fi}
\makeatother
\begin{document}
\begin{lstlisting}[mathescape=true]
Adicionar v à lista.
Adicionar $v$ à lista.
Adicionar $v$ onde?
R: à lista.
Yoda style: à lista, $v$ adicionar.
Adicionar $v$ à lista e à outra lista.
\end{lstlisting}
\end{document}
(2018 年 8 月 18 日补充——今天是星期六,我仍然没有勇气深入探讨源代码列表包裹。 ;-) )
但是当这样做的时候,我们就失去了让-mechanism产生材料的可能性literate
,而随后的空格标记不会导致产生更多的空白。
因此,每当该指令用于让 LaTeX 排版非空白时,最好只是\lst@whitespace
在 -directive 中将 -switch 设置为 false。literate
可能看起来像这样:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\makeatletter
\lstset{
literate=
{à}{{\`a\lst@whitespacefalse}}1
}
\makeatother
\begin{document}
\begin{lstlisting}[mathescape=true]
Adicionar v à lista.
Adicionar $v$ à lista.
Adicionar $v$ onde?
R: à lista.
Yoda style: à lista, $v$ adicionar.
Adicionar $v$ à lista e à outra lista.
\end{lstlisting}
\end{document}
我绝对不能保证我对情况的分析是正确的。
也许这是一个起点。
事情似乎进展顺利
要么添加
\lst@whitespacefalse
到定义\lst@Literate
或者在 -directive
\lst@whitespacefalse
内部应用literate
。
再说一遍:我绝对不能保证我对情况的分析是正确的。
也许这是一个起点。
如果认为在 -directive\lst@whitespacefalse
内部进行设置literate
是一种良好的做法,那么这应该在手册的某处提及,并且对于最终用户来说,应该有可能在不使用\makeatletter
..的情况下\makeatother
预先设置该开关。
如果您得出相同的结论,请随时提交错误报告。;-)