lstinputlisting 中的 linerange 引用

lstinputlisting 中的 linerange 引用

我有一个引用我的 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}

这不是最好的解决方案,但这是我发现的最佳解决方法!

相关内容