我编写了这个命令来获取代码“片段”:
\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) 目录结构中递归查找文件,而我使用find
Bash 来绕过它无法实现的事实。至少,我不相信它可以。
问题是,我怀疑这不是最好的方法,但它确实能达到我想要的效果。不过,我不太喜欢使用三个独立选项的方式,如果可能的话,我真的想避免这种情况,但我真的很难理解如何使用它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
?
任何帮助都将一如既往地受到高度赞赏。