在下面的 MWE 中,我定义了两种listings
语言(bluelang
和redlang
),每种语言都有一个foo
关键字,但来自不同的列表:
- 前者排名第一,
- 后者排名第二。
奇怪的是,如果在某个时候foo
从列表 1 中删除(使用\lstset{deletekeywords=[1]{foo}}
),foo
那么从列表 2 中删除也会被删除:有必要foo
从列表 2 中重新定义(使用\lstset{morekeywords=[2]{foo}}
)以覆盖此删除。
因此我的问题是:为什么deletekeywords=[1]{foo}
删除foo
由定义的关键字morekeywords=[2]{foo}
?
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstdefinelanguage{bluelang}{
morekeywords=[1]{foo,bar}
}
\lstdefinelanguage{redlang}{
morekeywords=[2]{foo,baz}
}%
\lstset{%
alsolanguage=bluelang,
alsolanguage=redlang,
keywordstyle={[1]\color{blue}},
keywordstyle={[2]\color{red}},
basicstyle=\ttfamily,
}%
\begin{document}
\begin{lstlisting}
foo bar baz
\end{lstlisting}
%
\lstset{deletekeywords=[1]{foo}}
%
\begin{lstlisting}
foo bar baz
\end{lstlisting}
%
\lstset{morekeywords=[2]{foo}}
%
\begin{lstlisting}
foo bar baz
\end{lstlisting}
\end{document}
答案1
我的评论不正确。事实是,据我所知,列表lstlisting
仅当您输入或 时才会清理其内存\lstinline
。
也就是说,你可以像more
这样玩delete
:
\lstset{
morekeywords=[4]{foo},
morekeywords=[3]{foo},
morekeywords=[2]{foo},
morekeywords=[1]{foo}
}
\lstset{
deletekeywords=[4]{foo}, % [4] deleted
deletekeywords=[2]{foo} % [2] deleted
}
\lstinline{foo} % [3] wins; [1] deleted automatically
然后列表将分配foo
给类别 3,因为这是第一个未取消的类别分配。然后所有与类别 1 有关的数据将被自动删除。
但是如果你输入\lstinline
从中间进入,那么列表将分配bar
给类别 1,并删除与类别 3、2、1 有关的所有数据。请注意,此时bar
内存中只有一个副本。因此,稍后当您尝试删除时,bar
您将从任何类别中删除它。
\lstset{
morekeywords=[4]{bar},
morekeywords=[3]{bar},
morekeywords=[2]{bar},
morekeywords=[1]{bar}
}
\lstinline{bar} % [4] wins; [3][2][1] deleted automatically
\lstset{
deletekeywords=[3]{bar}, % nothing to delete
deletekeywords=[2]{bar} % nothing to delete
}
\lstinline{bar} % delete all styling whatsoever
测试代码
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\begin{document}
\lstset{
basicstyle={\ttfamily\Huge[x]},
keywordstyle={[1]\Huge[1]\color{blue}},
keywordstyle={[2]\Huge[2]\color{red}},
keywordstyle={[3]\Huge[3]\color{green}},
keywordstyle={[4]\Huge[4]\color{yellow}}
}
\lstset{
morekeywords=[4]{foo},
morekeywords=[3]{foo},
morekeywords=[2]{foo},
morekeywords=[1]{foo}
}
\lstset{
deletekeywords=[4]{foo}, % [4] deleted
deletekeywords=[2]{foo} % [2] deleted
}
\lstinline{foo} % [3] wins; [1] deleted automatically
\lstset{
morekeywords=[4]{bar},
morekeywords=[3]{bar},
morekeywords=[2]{bar},
morekeywords=[1]{bar}
}
\lstinline{bar} % [4] wins; [3][2][1] deleted automatically
\lstset{
deletekeywords=[3]{bar}, % nothing to delete
deletekeywords=[2]{bar} % nothing to delete
}
\lstinline{bar} % delete all styling whatsoever
\end{document}
真实的故事
更深层次的答案是,无论何时你进入lstlisting
或\lstinline
列表将创建一个名为的宏,根据课程分配\lstk@bar
记住应该的风格。bar
然后当你尝试删除bar
然后当你尝试从特定类中列表虽然会记住关键字所分配到的类,但它不会利用此信息。相反,它会删除样式宏\lstk@bar
。
测试代码
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{tabto}
\NumTabs{3}
\begin{document}
\makeatletter
\ttfamily
\def\@nametrace#1 {%
\textbackslash#1\tab\expandafter\meaning\csname#1\endcsname
}
\def\traceall{
\hrule height4pt\noindent
\@nametrace lstk@foo \\
\@nametrace lstk@bar %\\
% \@nametrace lst@keywords@data
\hrule\noindent
% \@nametrace lst@keywords@list \\
\@nametrace lst@keywords \\
% \@nametrace lst@keywords@also \\
% \@nametrace lst@gkeywords@list \\
\@nametrace lst@gkeywords %\\
% \@nametrace lst@gkeywords@sty \\
% \@nametrace lst@keywordstyle \\
\hrule\noindent
% \@nametrace lst@keywords2@list \\
\@nametrace lst@keywords2 \\
% \@nametrace lst@keywords2@also \\
% \@nametrace lst@gkeywords2@list \\
\@nametrace lst@gkeywords2 %\\
% \@nametrace lst@gkeywords2@sty \\
% \@nametrace lst@keywordstyle2
\hrule\noindent
% \@nametrace lst@keywords3@list \\
\@nametrace lst@keywords3 \\
% \@nametrace lst@keywords3@also \\
% \@nametrace lst@gkeywords3@list \\
\@nametrace lst@gkeywords3 %\\
% \@nametrace lst@gkeywords3@sty \\
% \@nametrace lst@keywordstyle3
\hrule\noindent
% \@nametrace lst@keywords4@list \\
\@nametrace lst@keywords4 \\
% \@nametrace lst@keywords4@also \\
% \@nametrace lst@gkeywords4@list \\
\@nametrace lst@gkeywords4 %\\
% \@nametrace lst@gkeywords4@sty \\
% \@nametrace lst@keywordstyle4
\hrule height4pt
}
\lstset{
basicstyle={\ttfamily\Huge[x]},
keywordstyle={[1]\Huge[1]\color{blue}},
keywordstyle={[2]\Huge[2]\color{red}},
keywordstyle={[3]\Huge[3]\color{green}},
keywordstyle={[4]\Huge[4]\color{yellow}}
}
add foo to four classes
\lstset{
morekeywords=[4]{foo},
morekeywords=[3]{foo},
morekeywords=[2]{foo},
morekeywords=[1]{foo}
}
\traceall
and delete from some classes
\lstset{
deletekeywords=[4]{foo},
deletekeywords=[2]{foo},
}
\traceall
\lstinline{foo}
\traceall
\clearpage
add bar to four classes
\lstset{
morekeywords=[4]{bar},
morekeywords=[3]{bar},
morekeywords=[2]{bar},
morekeywords=[1]{bar}
}
\traceall
\lstinline{bar}
\traceall
delete bar from some classes
\lstset{
deletekeywords=[4]{bar},
deletekeywords=[2]{bar}
}
\traceall
\lstinline{bar}
\traceall
\clearpage
firstly, delete
\lstset{
deletekeywords=[3]{bar}
}
and then add
\lstset{
morekeywords=[4]{bar},
morekeywords=[3]{bar},
morekeywords=[2]{bar},
morekeywords=[1]{bar}
}
and then delete
\lstset{
deletekeywords=[4]{bar},
deletekeywords=[2]{bar}
}
and then add
\lstset{
morekeywords=[4]{bar}
}
\traceall
\lstinline{bar}
\traceall
\end{document}