列表中文字的间距问题

列表中文字的间距问题

我回答了这个问题楼主向我展示了答案中的一个问题。代码如下:

\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

  • 第二行和第六行显示了这个问题。
  • 第四行表明第三行的效果在换行后停止。
  • 第五行表示效果仅在mathescaped 文本之后开始
  • 第六行表明问题不会蔓延到接下来的literated 个字符。

使用该keepspaces选项显然可以解决问题。

从外表来看思考这是一个错误。如何修复?


我还得出结论,这v肯定被添加到列表中:)

答案1

(2018 年 8 月 12 日——今天是星期天,我没有勇气深入探讨源代码列表包裹

但在浏览源代码时,我得到的印象是

  1. 通过密钥提供的内容的替换过程背后的宏literate被称为\lst@Literate

  2. 有一个开关\lst@ifwhitespace,它指示最后处理的东西是否是作为空白打印的空格。

  3. 的代码\lst@Escape\lst@Escape似乎是所有那些用于转义为 LaTeX 的东西的基础 — 确实在被使用时将该开关设置为 false,因为该开关为mathescapetrue。所以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预先设置该开关。

如果您得出相同的结论,请随时提交错误报告。;-)

相关内容