与“xkeyval”和“newcommand”混淆:与“lstinputlisting”一起使用的更好方法

与“xkeyval”和“newcommand”混淆:与“lstinputlisting”一起使用的更好方法

我编写了这个命令来获取代码“片段”:

\newcommand\codesnippetsnippet[3]{
\immediate\write18{find ../../../.. -name '#1' -print | grep #2 | xargs cat > ./listingwithoutcomments}

\lstinputlisting[autogobble=true,linerange=#3,rangeprefix=//---,includerangemarker=false,language=mycodelanguage,frame=single]{./listingwithoutcomments}

\immediate\write18{rm -f -- 'listingwithoutcomments'}
}

它的使用方式如下:

\codesnippet{option1}{option2}{option3}

更详细地说:

\codesnippet{thisissomecode.codefile}{thisisagrepfilter}{thisisalinerangemarker}

这样做的动机基本上是因为我试图lstinputlisting在 (Linux) 目录结构中递归查找文件,而我使用findBash 来绕过它无法实现的事实。至少,我不相信它可以。

问题是,我怀疑这不是最好的方法,但它确实能达到我想要的效果。不过,我不太喜欢使用三个独立选项的方式,如果可能的话,我真的想避免这种情况,但我真的很难理解如何使用它xkeyval来实现这一点,我认为这是我最好的选择。例如,我真正想要的是能够codesnippet像这样使用:

\codesnippet[filename=,grepfilter=,linerangemarker=}

...或者甚至更好,实际上根据 lstinputlisting 选项使用 linerange,但我怀疑这可能是不可能的:

\codesnippet[filename=,grepfilter=,linerange=}

我认为我的问题源于我lstinputlisting在“新命令”中嵌入了一个命令(),并且由于我没有任何尝试,所以xkeyval我只想问是否有人可以:

A.帮助我走上正确的轨道,理解我将如何xkeyval想出这样的事情:

\codesnippet[filename=,grepfilter=,linerangemarker=}

B. 帮助我理解使用是否lstinputlisting会使事情复杂化,因为它有自己的选项

C.(奖励)帮助我了解是否有更好的方法可以完成此操作,以及我可能还做错了什么...例如,有没有办法在lstinputlisting不使用完全的情况下递归地查找文件find

任何帮助都将一如既往地受到高度赞赏。

相关内容