列表环境中的星号较高

列表环境中的星号较高

我目前正在进行的项目是包含任意编程语言代码的文档通用模板。具体来说,我正尝试使用该lstlistings包为文档中的代码制作一个漂亮的布局。但是,我在布局中放置星号时遇到了一些麻烦。

坏星号

具体来说,我遇到的问题是,打字机字体系列倾向于将星号垂直居中放置,而大多数其他字体则将星号放置在行的顶部附近。

我的理想解决方案源自在列表中突出显示星号,基本上是为了替换用于呈现星号的字体。

literate=\*{\*}{\normalfont{\*}}1我尝试模仿这种方法并加以扩展。具体来说,我在命令中使用键值对\lstset。(literate 是字符串替换的一种形式。更多信息:listings文档,第 50 页)。基本思想是将每个星号都设为默认字体,而不是打字机字体。

这个解决方案适用于大多数文档,但正如最佳答案所说,那里提出的解决方案“仅适用于列表正常模式,不在字符串,注释,和其他分隔的内容中。“这正是我遇到的问题。在大多数编程语言中,分隔符/* ... */定义多行注释。但是,当您开始使用分隔符的子字符串时,上述解决方案会导致很多问题。

有一个可选的星号,您可以省略 literate 命令(即,literate={\*}{\normalfont{\*}}1改为literate=\*{\*}{\normalfont{\*}}1")“表示应该在字符串、注释和其他分隔文本中进行文字替换”,人们会认为这可以解决问题,但是在替换文本后,它就不再表现良好了。

解析错误

正如您在该屏幕截图中看到的,粉红色的多行注释颜色延伸到了结束分隔符之外。

奇怪的是,即使您使用 literate 简单地将星号替换为另一个相同的星号 ( literate={\*}{\*}1),也会发生这种情况。

我想象到的其他解决方案:

  • 处理它
  • 以某种方式预处理/预格式化代码以用其他分隔符替换所有出现的/*和。*/
  • 对注释中的每个标记执行某种非常混乱的条件字符串替换(解析注释时,似乎每个标记都被赋予了样式,而不是将整个注释作为一段文本)

fontenc我并没有否定使用该包来使用具有更好星号的打字机字体的想法,但是由于某种原因,加载该fontenc包会使编译时间变得非常长,所以我现在想坚持使用默认字体。

相关代码:

主文本:

\usepackage{listings} 
\usepackage{color} 
\definecolor{stringColor}{RGB}{42,0.0,255}
\definecolor{keyword1Color}{RGB}{63,127,95}
\definecolor{keyword2Color}{RGB}{63,127,200}
\definecolor{singleLineCommentColor}{RGB}{127,0,85}
\definecolor{multiLineCommentColor}{RGB}{200,0,127}

\lstdefinelanguage{test}{
    basicstyle=\linespread{0.83}\small\ttfamily, % Global Code Style
    literate=*{*}{\normalfont{*}}1,
    morecomment=[l][\color{singleLineCommentColor}]{//}, 
    morecomment=[s][\color{multiLineCommentColor}]{/*}{*/},
    morestring=[b]",
    morestring=[b]',
    commentstyle=\color{commentColor}, 
    keywordstyle=[1]{\bfseries\color{keyword1Color}}, 
    keywordstyle=[2]{\bfseries\color{keyword2Color}}, 
    stringstyle=\color{stringColor}, 
    %...
}

\begin{document}
\lstinputlisting[language=test]{code1.txt}
\end{document}

code1.txt(测试代码)

import math

def hi():
    print "Hello!"
    print "This is a test!"
    print 'This is a test!'
    print "This is a 'single 'quote within 'a double quote 'string" 
    one two three four five six seven eight nine
    //Comment 1
    /* Bad asterisk placement! */ 
    $t=0$ //Disable math parsing
def f(x):
    return x**2 //Good asterisk placement

任何建议都将不胜感激。我已经研究了几个小时,但没有什么成果(尽管这对我进一步了解 TeX 的工作原理非常有用)如果我遗漏了任何相关信息,请告诉我,我会尽快更新帖子。

答案1

您可以更改处理星号时使用的命令列表:

\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{listings}

\usepackage{color}
\definecolor{stringColor}{RGB}{42,0.0,255}
\definecolor{keyword1Color}{RGB}{63,127,95}
\definecolor{keyword2Color}{RGB}{63,127,200}
\definecolor{singleLineCommentColor}{RGB}{127,0,85}
\definecolor{multiLineCommentColor}{RGB}{200,0,127}

\lstdefinelanguage{test}{
    basicstyle=\linespread{0.83}\small\ttfamily, % Global Code Style
    %literate=*{*}{\normalfont{*}}1,
    morecomment=[l][\color{singleLineCommentColor}]{//},
    morecomment=[s][\color{multiLineCommentColor}]{/*}{*/},
    morestring=[b]",
    morestring=[b]',
    commentstyle=\color{commentColor},
    keywordstyle=[1]{\bfseries\color{keyword1Color}},
    keywordstyle=[2]{\bfseries\color{keyword2Color}},
    stringstyle=\color{stringColor},
    %...
}



\begin{document}
\begin{lstlisting}[language=test]
    /* Bad asterisk placement! */
x**3
\end{lstlisting}    

\makeatletter
\lst@CCPutMacro
    \lst@ProcessOther {"2A}{%
      \lst@ttfamily 
         {\raisebox{2pt}{*}}% used with ttfamily
         \textasteriskcentered}% used with other fonts
    \@empty\z@\@empty
\makeatother  

\begin{lstlisting}[language=test]
    /* good asterisk placement! */
x**3
\end{lstlisting}

\end{document}

在此处输入图片描述

相关内容