2022 年 8 月 24 日更新:

2022 年 8 月 24 日更新:

在回答这个问题,建议采用以下解决方案来提高星号:

\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}

在此处输入图片描述

相关内容