使用 Bash 列表加粗变量和函数

使用 Bash 列表加粗变量和函数

我正在使用该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}

结果:(注意哪些字符是粗体) 列表中的 bash 脚本中的花括号

简而言之,将\{关键词放在首位并不能使该$\{关键词也能被识别。\{在列表顺序中移动没有区别,而删除它可以$\{被识别,但不是单个{字符。我也尝试过转义该$字符,但没有效果。

请注意,这似乎并不完全重复例如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}

因此,重新定义我的bashsh列出语言定义可能有些过头了,但通过这种特定方式,我可以将其保留在文档中,而不是lstlangX.sty直接编辑我的文件它不会与您可能在同一文档中列出的其他语言(如 Python)发生冲突。它不太美观,但您无法在 LyX 中获得所谓的 ERT,这值得一试。

结果: 新的类似 LyX 的结果

(这是比我原始问题中的答案更具体的答案;不仅仅是对 MWE 的简单纠正,但这是我的具体情况,因此上面的内容更接近我的具体解决方案。)

相关内容