我使用moredelim
with*
来突出显示我的 中的某些文本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}