在回答这个问题,建议采用以下解决方案来提高星号:
\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}
我注意到了两件事:
i)代码仅在以下行时有效
basicstyle=\linespread{0.83}\small\ttfamily, % Global Code Style
%literate=*{*}{\normalfont{*}}1,
在环境中使用test
,但我不想使用它,因为它似乎会改变字体类型。有什么方法可以保留通常的字体类型lstlisting
吗?
ii) 如何在同一lstlisting
环境中同时存在“通常”和凸起的星号,而该解决方案无法做到这一点?
谢谢。
编辑:恐怕答案中似乎有一个错误:当我写
\begin{lstlisting}[language=test]
test_one, test_two = do_tests()
\end{lstlisting}
编辑 2:虽然我们越来越接近,但当使用>
或时<
,恐怕编辑的解决方案也会中断:
\documentclass{scrbook}
\usepackage{listings}
\begin{document}
% https://tex.stackexchange.com/questions/654560/follow-up-to-higher-asterisks-in-lstlisting-environment
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"2A}{%
\lst@ttfamily
{\raisebox{2pt}{*}}% used with ttfamily
{\raisebox{1pt}{*}}% used with other fonts
}
\lst@ProcessOther{"40}{\textasteriskcentered}% centered asterisk typed as @
\@empty\z@\@empty
\makeatother
\begin{lstlisting}[language=python, alsoletter={[,]}]
# Regular font
x**3
# Using "at" symbol to print centered asterisk
x@@3
test_one, test_two = do_tests()
x > y
x < y
\end{lstlisting}
\end{document}
这次怎么能把星号固定下来呢?为什么第一次就出现这个星号?我以为我们烤它?
~
编辑 3:当我想使用 nice和 literate时似乎存在令人讨厌的干扰,正如答案中所建议的那样:
\documentclass{scrbook}
\usepackage{listings}
\begin{document}
% https://tex.stackexchange.com/questions/17266/how-to-insert-a-nice-tilde-in-a-lstlisting
\lstset{
literate={~} {$\sim$}{1}
}
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"2A}{%
\lst@ttfamily
{\raisebox{0pt}{*}}% used with ttfamily
{\raisebox{1pt}{*}}% used with other fonts
}
\@empty\z@\@empty
\makeatother
\begin{lstlisting}[language=python, literate={(*)}{\textasteriskcentered}{1}]
/* Raised and cencetred asterisks */
x**3, x(*)(*)3
x[~mask] = 0
\end{lstlisting}
\end{document}
当我省略时literate={(*)}{\textasteriskcentered}{1}
,输出如下所示:
我怎样才能既能使用文字,又能同时拥有美观的外观~
?
答案1
2022 年 8 月 24 日更新:
有一种更简单、更灵活的方法来替换内部的东西lstlisting
。
在5.4 文学编程部分手动的它所描述的literate
键正是您想要实现的功能——用自定义文本替换某些内容。
因此,解决你的问题就像添加一样简单
literate={(*)}{\textasteriskcentered}{1}
您的test
语言定义。
请注意,它非常灵活,因为您不仅限于单个字符替换,还可以替换任何序列。上面写的选项将所有出现的替换为(*)
常规(默认居中)星号。所以基本上,如果您愿意,您可以更改(*)
为myCenteredAsterisk
或任何您认为方便且易于使用的内容。
但是,用这种方法将所有注释都替换为*
凸起的注释效果并不好,因为多行注释会被破坏,所以您必须使用旧方法进行*
替换。
\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}{
literate={(*)}{\textasteriskcentered}{1},
morecomment=[l][\color{singleLineCommentColor}]{//},
morecomment=[s][\color{multiLineCommentColor}]{/*}{*/},
morestring=[b]",
morestring=[b]',
% alsoletter={[,]},
commentstyle=\color{commentColor},
keywordstyle=[1]{\bfseries\color{keyword1Color}},
keywordstyle=[2]{\bfseries\color{keyword2Color}},
stringstyle=\color{stringColor},
}
\begin{document}
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"2A}{%
\lst@ttfamily
{\raisebox{2pt}{*}}% used with ttfamily
{\raisebox{1pt}{*}}% used with other fonts
}
\@empty\z@\@empty
\makeatother
\begin{lstlisting}[language=test]
/* Raised and cencetred asterisks */
x**3, x(*)(*)3
\end{lstlisting}
\end{document}
使用预定义语言,例如python
,只需使用
\begin{lstlisting}[language=python, literate={(*)}{\textasteriskcentered}{1}]
/* Raised and cencetred asterisks */
x**3, x(*)(*)3
\end{lstlisting}
尽管建议使用上述方法,但原来的方法也可以修复。由于,
中是特殊字符lstlisting
,它使用了一些包含@
在其中的中间宏,因此逗号前有一个奇怪的额外星号。要修复它,您可以烤 ,
通过添加被视为字母
alsoletter={[,]}
语言定义的选项test
。如果您使用预定义语言,python
例如
\begin{lstlisting}[language=python, alsoletter={[,]}]
text...
\end{lstlisting}
原始答案:
带有任意字体的星号
乌尔丽克·菲舍尔有意对代码进行注释,以便您可以了解其工作原理。
具体来说,这部分
\lst@ttfamily
{\raisebox{2pt}{*}}% used with ttfamily
\textasteriskcentered}% used with other fonts
从这里你立即可以理解为什么这不起作用,如果你删除basicstyle
包含\ttfamily
使更改应用的选项吨伊佩里吨呃家庭则使用字体,否则\textasteriskcentered
放置。
如果代码采用这种格式,可能会更容易理解
\lst@ttfamily{<when tt font>}{<any other font>}
因此,如果你想让星号在字体上凸起,只需替换
\lst@ttfamily{...}{...}
和
\raisebox{2pt}{*}
在我看来,普通字体的星号有点太高了,所以我会使用
\lst@ttfamily
{\raisebox{2pt}{*}}% used with ttfamily
{\raisebox{1pt}{*}}% used with other fonts
反而。
使用凸起和居中的星号
由于lstlisting
是逐字环境,您无法通过用户定义的宏来完成排版居中星号的任务,因此您必须以相同的方式更改另一个符号。
例如,这部分代码将@
用居中的星号替换所有。
\lst@ProcessOther{"40}{\textasteriskcentered}
如果你想使用其他符号,请将其十六进制 ascii 代码作为第一个参数传递,并在\lst@ProcessOther
前面加上前缀"
,以便让 LaTeX 知道它实际上是十六进制数字。你可以使用转换器轻松找出任何字符的十六进制代码。
完整 MWE
\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, % Global Code Style
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},
alsoletter={[,]} % was added after an edit
}
\lstdefinelanguage{testt}{
basicstyle=\linespread{0.83}\small\ttfamily, % Global Code Style
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},
alsoletter={[,]} % was added after an edit
}
\begin{document}
\makeatletter
\lst@CCPutMacro
\lst@ProcessOther {"2A}{%
\lst@ttfamily
{\raisebox{2pt}{*}}% used with ttfamily
{\raisebox{1pt}{*}}% used with other fonts
}
\lst@ProcessOther{"40}{\textasteriskcentered}% centered asterisk typed as @
\@empty\z@\@empty
\makeatother
\begin{lstlisting}[language=test]
/* Regular font */
x**3
/* Using "at" symbol to print centered asterisk */
x@@3
\end{lstlisting}
\medskip
\begin{lstlisting}[language=testt]
/* Regular font */
x**3
/* Using "at" symbol to print centered asterisk */
x@@3
\end{lstlisting}
\end{document}