我正在使用该listings
包来展示一些示例 bash 脚本行;但是,该otherkeywords
参数给我带来了麻烦。正如listings
文档所述:
如果一个关键字是另一个关键字的子序列(如 -- 和 -->),则必须先指定较短的关键字。
但这似乎在实践中并未得到证实,至少在花括号字符中未得到证实。我承认我希望这只是一些转义语法错误。
\documentclass[preview,varwidth,border=5pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{
beramono,
listings,
textcomp
}
\lstset{breaklines=true,
frame=tb,
language=bash,
breakatwhitespace=true,
alsoletter={*()"'0123456789.},
alsoother={\{\=\}},
basicstyle={\small\ttfamily},
commentstyle={\itshape},
keywordstyle={\bfseries},
literate={{=}{{{=}}}1},
prebreak={\textbackslash},
sensitive=true,
stepnumber=1,
tabsize=4,
upquote=true,
morekeywords={echo, function},
otherkeywords={},
otherkeywords={
-, \{, $\{, \}
}}
%% Removing the left curly-brace from the list of otherkeywords make variable names look right but not function clauses.
%% (The hyphen is needed only because the otherkeywords list cannot start with an escaped curly brace.)
\begin{document}
\begin{lstlisting}
function test() { VAR='$12'; echo ${VAR}; }
\end{lstlisting}
Should look like:
\texttt{{\bfseries{}function} test() {\bfseries{}\{} VAR='\$12'; {\bfseries{}\$\{}VAR{\bfseries{}\}}; {\bfseries{}\}}}
but all of the following are wrong:
\texttt{{\bfseries{}function} test() {\bfseries{}\{} VAR='\$12'; \${\bfseries{}\{}VAR{\bfseries{}\}}; {\bfseries{}\}}}
\texttt{{\bfseries{}function} test() \{ VAR='\$12'; {\bfseries{}\$\{}VAR{\bfseries{}\}}; {\bfseries{}\}}}
\texttt{{\bfseries{}function} test() {\bfseries{}\{} VAR='{\bfseries{}\$}12'; {\bfseries{}\$\{}VAR{\bfseries{}\}}; {\bfseries{}\}}}
\end{document}
简而言之,将\{
关键词放在首位并不能使该$\{
关键词也能被识别。\{
在列表顺序中移动没有区别,而删除它可以$\{
被识别,但不是单个{
字符。我也尝试过转义该$
字符,但没有效果。
请注意,这似乎并不完全重复例如R 列表运算符部分以粗体显示因为正如接受的答案/解决方法指出的那样,首先放置简短版本并不能解决我的情况。
答案1
阅读Bash lstlistings 将“$#”视为注释让我想到只需添加一个literate
即可解决此问题。在我的列表设置中,我完全添加literate={\$\{}{{{{\bfseries{}\$\{}}}}2,
并$\{
从otherkeywords
列表中删除了它。事实上,与我的 MWE 不同,由于我使用的是 LyX,我通过将其添加到\AtBeginDocument{}
我的 LaTeX 序言中的来解决它,例如:
\documentclass[varwidth,border=5pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{
color,
beramono,
listings,
textcomp
}
\definecolor{lightgray}{RGB}{245,245,245}
\definecolor{darkgray}{RGB}{128,128,128}
\lstset{
abovecaptionskip={0cm},
backgroundcolor={\color{lightgray}},
basicstyle={\small\ttfamily},
breakatwhitespace=true,
breaklines=true,
captionpos=b,
frame=tb,
resetmargins=true,
sensitive=true,
stepnumber=1,
tabsize=4,
upquote=true
}
\AtBeginDocument{\lstdefinelanguage{bash}[]{sh}%
{morekeywords={alias,bg,bind,builtin,caller,command,compgen,compopt,%
complete,coproc,curl,declare,disown,dirs,enable,fc,fg,help,%
history,jobs,let,local,logout,mapfile,printf,pushd,popd,%
readarray,select,set,suspend,shopt,source,times,type,typeset,%
ulimit,unalias,wait},%
otherkeywords={ [, ], [[, ]], \{, \} }%
}%
\lstdefinelanguage{sh}%
{morekeywords={awk,break,case,cat,cd,continue,do,done,echo,elif,else,%
env,esac,eval,exec,exit,export,expr,false,fi,for,function,getopts,%
hash,history,if,in,kill,login,newgrp,nice,nohup,ps,pwd,read,%
readonly,return,set,sed,shift,test,then,times,trap,true,type,%
ulimit,umask,unset,until,wait,while},%
morecomment=[l]\#,%
morestring=[d]",%
alsoletter={*"'0123456789.},%
alsoother={\{\=\}},%
literate={{=}{{{=}}}1},%
literate={\$\{}{{{{\bfseries{}\$\{}}}}2,%
otherkeywords={ [, ], \{, \} }%
}[keywords,comments,strings]%
}
\begin{document}
\begin{lstlisting}[language=bash]
function test() { VAR='$12'; echo ${VAR}; }
for i in "one" "two" "three" "four" "five"; do
printf "%7s\n" "${i}"
done
\end{lstlisting}
\end{document}
因此,重新定义我的bash
和sh
列出语言定义可能有些过头了,但通过这种特定方式,我可以将其保留在文档中,而不是lstlangX.sty
直接编辑我的文件和它不会与您可能在同一文档中列出的其他语言(如 Python)发生冲突。它不太美观,但您无法在 LyX 中获得所谓的 ERT,这值得一试。
(这是比我原始问题中的答案更具体的答案;不仅仅是对 MWE 的简单纠正,但这是我的具体情况,因此上面的内容更接近我的具体解决方案。)