我目前正在进行的项目是包含任意编程语言代码的文档通用模板。具体来说,我正尝试使用该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}