如何在列表中强调并保持源列对齐?

如何在列表中强调并保持源列对齐?

我使用moredelimwith*来突出显示我的 中的某些文本lstlisting

\documentclass{article}
\usepackage{listings}
\usepackage[LY1]{fontenc}     
\renewcommand{\rmdefault}{ptm}
\renewcommand{\ttdefault}{pcr}
\lstset{basicstyle=\ttfamily,columns=flexible,keepspaces=true}
\begin{document}
\setlength\parindent{0pt}
\rule{9cm}{1pt}
\begin{lstlisting}[moredelim={[is][\bfseries]{*}{*}}] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0     *x10  300.0*
  *x2  300.0*     *x10  400.0*      *x3  300.0*
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}
\end{document}

在此处输入图片描述

输出很好。不幸的是,由于*宽度为零,源中的对齐全部被扭曲。是否可以将lstlisting其视为*单个空格字符,以便以下源生成相同的输出?

  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0    *x10  300.0*
 *x2  300.0*   *x10  400.0*    *x3  300.0*
 x10  200.0      x2   50.0      x2  100.0

作为一种解决方法,我尝试用literate={'}{\ }2替换'2 个空格。不幸的是,这似乎破坏了columns=flexible

\rule{9cm}{1pt}
\begin{lstlisting}[moredelim={[is][\bfseries]{*}{*}},literate={'}{\ }2] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0   '*x10  300.0*'
'*x2  300.0*' '*x10  400.0*'  '*x3  300.0*'
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}

\begin{lstlisting}[moredelim={[is][\bfseries]{*}{*}},literate={'}{\ }2,columns=fixed] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0   '*x10  300.0*'
'*x2  300.0*' '*x10  400.0*'  '*x3  300.0*'
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}

在此处输入图片描述

我无法更改字体编码或字体类型。

答案1

您可以侵入[i]类型分隔符\lst@BeginIDelim和的命令\lst@EndIDelim。添加新的分隔符类型会更好,但这需要重新定义许多内部命令。

\documentclass{article}
\usepackage{listings}
\usepackage[LY1]{fontenc}     
\renewcommand{\rmdefault}{ptm}
\renewcommand{\ttdefault}{pcr}
\lstset{basicstyle=\ttfamily,columns=flexible,keepspaces=true}
\makeatletter
\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{\fi\lst@ProcessSpace\iffalse}{}}
\def\lst@EndIDelim{\lst@DelimClose\iffalse{\fi\lst@ProcessSpace\iffalse}}
\makeatother
\begin{document}
\setlength\parindent{0pt}
\rule{9cm}{1pt}
\begin{lstlisting}[moredelim={[is][\bfseries]{*}{*}}] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0    *x10  300.0*
 *x2  300.0*   *x10  400.0*    *x3  300.0*
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}

\begin{lstlisting}[moredelim={[is][\bfseries]{*}{*}},columns=fixed] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0    *x10  300.0*
 *x2  300.0*   *x10  400.0*    *x3  300.0*
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}
\end{document}

在此处输入图片描述

编辑:如果您不想将moredelim格式命令应用于空格,您可以改用

\def\lst@BeginIDelim{\lst@ProcessSpace\lst@DelimOpen\iffalse{}{}}
\def\lst@EndIDelim{\lst@DelimClose\iffalse{\fi\egroup\lst@ProcessSpace\bgroup\iffalse}}

例如

\documentclass{article}
\usepackage{listings}
\usepackage[LY1]{fontenc}     
\renewcommand{\rmdefault}{ptm}
\renewcommand{\ttdefault}{pcr}
\lstset{basicstyle=\ttfamily,columns=flexible,keepspaces=true}
\makeatletter
\def\lst@BeginIDelim{\lst@ProcessSpace\lst@DelimOpen\iffalse{}{}}
\def\lst@EndIDelim{\lst@DelimClose\iffalse{\fi\egroup\lst@ProcessSpace\bgroup\iffalse}}
\makeatother
\begin{document}
\setlength\parindent{0pt}
\rule{9cm}{1pt}
\begin{lstlisting}[moredelim={[is][\underbar]{*}{*}}] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0    *x10  300.0*
 *x2  300.0*   *x10  400.0*    *x3  300.0*
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}

\begin{lstlisting}[moredelim={[is][\underbar]{*}{*}},columns=fixed] 
  id     #1      id     #2      id     #3
  x3  100.0      x3  200.0    *x10  300.0*
 *x2  300.0*   *x10  400.0*    *x3  300.0*
 x10  200.0      x2   50.0      x2  100.0
\end{lstlisting}
\end{document}

结果是 在此处输入图片描述

相关内容