![在列表中为现有语言添加关键字](https://linux22.com/image/268842/%E5%9C%A8%E5%88%97%E8%A1%A8%E4%B8%AD%E4%B8%BA%E7%8E%B0%E6%9C%89%E8%AF%AD%E8%A8%80%E6%B7%BB%E5%8A%A0%E5%85%B3%E9%94%AE%E5%AD%97.png)
我已经读过了使用附加关键字来扩展语言我已经找到了一种解决方案,但我不太确定这是否是正确的方法,以及将来是否会遇到问题。
场景是这样的:我有不同的 ruby、Java 和自定义代码片段,顺序是随机的(不是先是所有 ruby 代码,然后是所有 Java 代码,等等)。
以下是一个 MWE 来说明:
\documentclass[11pt]{report}
\usepackage{listings}
\usepackage{framed}
\usepackage{xcolor}
\lstset{ %
basicstyle=\footnotesize\ttfamily,
numbers=left,
numberstyle=\tiny\color{gray}\ttfamily,
numbersep=5pt,
backgroundcolor=\color{white},
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
rulecolor=\color{black},
captionpos=b,
keywordstyle=\color{blue}\bf,
commentstyle=\color{gray},
stringstyle=\color{green},
keywordstyle={[2]\color{red}\bf},
}
\lstdefinelanguage{story}
{morekeywords={Given,When,Then},
sensitive=false,
morekeywords={[2]Scenario},
}
\begin{document}
First some ruby code
\lstinputlisting[language=Ruby,caption={Ruby}]{ruby_code.rb}
Now some java code
%\lstset{language=Java}
%\lstset{ morekeywords={[2]@Given,@When,@Then}}
\lstinputlisting[language=Java,caption={Java}]{JavaCode.java}
Now some story code
\lstinputlisting[language=story,caption={Story}]{story_code.story}
\end{document}
我只放出最令人困扰和我真正关心的 Java 代码:
// JavaCode.java
public class ComportamientoSteps {
Croupier croupier;
@Given("una nueva mano")
public void nuevaMano() {
croupier = new Croupier();
}
@When("el croupier tiene $carta1 y $carta2")
public void elCroupierTiene(int carta1, int carta2) {
croupier.agregarCarta(new Carta(carta1));
croupier.agregarCarta(new Carta(carta2));
}
@Then("$valor deberia plantar")
public void croupierDeberiaPlantar(String valor) {
boolean debe_pedir = valor.equals("no");
assertThat(croupier.debePedirOtraCarta(), equalTo(debe_pedir));
}
}
我想要做的是:
- 首先,为所有代码片段定义一种通用的样式:大小、颜色
keywords
等[2]keywords
。我希望每种语言都有这种风格。 - 然后定义非常简单的故事语言。
- 最后,我通过输入代码
\lstinputlisting[language=whatever]{file}
我想扩展 Java 语言以将 解释为@Given
。在 MWE 中有一段代码被注释掉了,使用这段代码就可以工作(您必须在选项中删除 ),但我不想每次必须输入 Java 代码时都这样做,我只想使用和选项。此外,我不知道这样将语言设置为 Java 是否会给我将来的列表带来麻烦。@When
@Then
[2]keywords
language=Java
lstinputlisting
language
答案1
列表是一个强大的工具,可以在这里找到更多文档:列表包。
您不应该设置全局设置,而应该为每个单独的列表设置样式
流动的代码应该可以让您很好地了解如何定制列表。
\documentclass{article}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{xcolor}
\lstdefinestyle{basic}{
basicstyle=\footnotesize\ttfamily,
numbers=left,
numberstyle=\tiny\color{gray}\ttfamily,
numbersep=5pt,
backgroundcolor=\color{white},
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
rulecolor=\color{black},
captionpos=b,
keywordstyle=\color{blue}\bf,
commentstyle=\color{gray},
stringstyle=\color{green},
keywordstyle={[2]\color{red}\bf},
}
\lstdefinelanguage{custom}
{
morekeywords={public, void},
sensitive=false,
morecomment=[l]{//},
morecomment=[s]{/*}{*/},
morestring=[b]",
}
\begin{document}
\lstinputlisting[ style=basic, language=Python]{main.java}
\lstinputlisting[ style=basic, language=Java]{main.java}
\lstinputlisting[ style=basic, language=custom]{main.java}
\end{document}
上述代码中呈现了三种版本的定制列表
它们都使用相同的颜色来标识:字符串、注释、关键字。
我还展示了如何根据您的需要创建新语言。您可以使用现有语言作为基础并添加更多关键字。
[更新]
这里有一组不同的风格,我个人更喜欢这个。
\documentclass{article}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{color}
\usepackage{accsupp}
\definecolor{dkblue}{rgb}{0,0,0.5}
\definecolor{comment}{rgb}{1,0,0}
\definecolor{mauve}{rgb}{.627,.126,.941}
\definecolor{purple}{rgb}{0.5, 0, 0.545098}
\lstdefinestyle{java}{
belowcaptionskip=1\baselineskip,
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
breaklines=true, % sets automatic line breaking
xleftmargin=\parindent,
language=Java,
tabsize=4,
tabsize=4,
numbers=left,
showstringspaces=false,
numberstyle=\tiny\noncopynumber,
basicstyle=\footnotesize\ttfamily,
keywordstyle=\bfseries\color[rgb]{.133,.545,.133},
commentstyle=\itshape\color{blue},
stringstyle=\color{mauve},
directivestyle=\bfseries\color{purple},
frame=single],
resetmargins=true,
}
\lstdefinestyle{mathlab}{
belowcaptionskip=1\baselineskip,
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
breaklines=true, % sets automatic line breaking
xleftmargin=\parindent,
language=C,
morekeywords={end, elseif},
comment=[l]\%, % comments
tabsize=4,
numberstyle=\tiny\noncopynumber,
showstringspaces=false,
basicstyle=\footnotesize\ttfamily,
keywordstyle=\color[rgb]{0,0,1},
commentstyle=\itshape\color[rgb]{.133,.545,.133},
stringstyle=\color{mauve},
directivestyle=\bfseries\color{purple},
framexleftmargin=3mm,
frame=single,
}
\newcommand{\noncopynumber}[1]{%
\BeginAccSupp{method=escape,ActualText={}}%
#1%
\EndAccSupp{}%
}
\begin{document}
\lstinputlisting[caption=Matlab style main code: "main.java", style=mathlab]{main.java}
\lstinputlisting[caption=Matlab style main code: "main.java", style=java]{main.java}
\end{document}