我有一个引用我的 c 代码的清单;我想使用代码中的注释部分来引用代码,如下面的代码示例所示。
我已经创建了一个可以实现这一点的列表样式,但如果我尝试隐藏范围标记,它就无法结束范围。我得出的结论是,如果我从语言中删除注释。它也能正常工作,但我希望该部分仍然是注释部分。
在所包含的示例中,包含了三种使用列表的类型,以尝试突出显示该问题。
\documentclass[a4paper,10pt,oneside]{memoir}
\usepackage{listings}
\usepackage{lipsum}
\usepackage{filecontents}
\lstdefinestyle{c}{
breaklines=true,%
rangeprefix={\/\/\ \{\ },% curly left brace plus space
rangesuffix={\ \}},% space plus curly right brace
rangebeginsuffix={\ start},
rangeendsuffix={\ end},
includerangemarker=false
}
\lstdefinelanguage{nocomc}[]{c}
{sensitive=false,
deletecomment=[s]{/*}{*/},
}
\begin{document}
\begin{filecontents*}{foo.c}
#define one 1
#define two 2
#define three 3
#define four 4
// { main start }
/*----------------------------------------------------------
* Namme : turnBehaviorCan
* Description :
* The pathfinding of the robot
*
* Parameters : None
* Return Value : None
*----------------------------------------------------------*/
int main(){
do stuff
}
// { main end }
// { main2 start }
void main2(){
do stuff
}
// { main2 end }
\end{filecontents*}}
Works without comments
\lstinputlisting[
language=nocomc,
style=c,
linerange={main}] {foo.c}
Fails with comments
\lstinputlisting[
language=c,
style=c,
linerange={main}] {foo.c}
Works with comments
\lstinputlisting[
language=c,
style=c,
includerangemarker=true,
linerange={main}] {foo.c}
\end{document}
答案1
进一步缩小范围后,我得出结论,问题是由使用多行注释引起的。如果将函数描述中的注释每行都替换为 // 而不是单个 /* */,它也会起作用。我不知道这是 latex 本身的一个错误还是一个限制!
以下代码在这三种情况下均有效。
\documentclass[a4paper,10pt,oneside]{memoir}
\usepackage{listings}
\usepackage{lipsum}
\usepackage{filecontents}
\lstdefinestyle{c}{
breaklines=true,%
rangeprefix={\/\/\ \{\ },% curly left brace plus space
rangesuffix={\ \}},% space plus curly right brace
rangebeginsuffix={\ start},
rangeendsuffix={\ end},
includerangemarker=false
}
\lstdefinelanguage{nocomc}[]{c}
{sensitive=false,
deletecomment=[s]{/*}{*/},
}
\begin{document}
\begin{filecontents*}{foo.c}
#define one 1
#define two 2
#define three 3
#define four 4
// { main start }
//----------------------------------------------------------
// Namme : turnBehaviorCan
// Description :
// The pathfinding of the robot
//
// Parameters : None
// Return Value : None
//----------------------------------------------------------
int main(){
do stuff
}
// { main end }
// { main2 start }
void main2(){
do stuff
}
// { main2 end }
\end{filecontents*}}
Works without comments
\lstinputlisting[
language=nocomc,
style=c,
linerange={main}] {foo.c}
Fails with comments
\lstinputlisting[
language=c,
style=c,
linerange={main}] {foo.c}
Works with comments
\lstinputlisting[
language=c,
style=c,
includerangemarker=true,
linerange={main}] {foo.c}
\end{document}
这不是最好的解决方案,但这是我发现的最佳解决方法!