我正在编写一个\bashDemo
宏,它将 (a) 在 shell(例如 bash、脚本)中执行其参数,以及 (b) 在列表中显示该参数。因此,
\bashDemo
ls -ls > myfiles
\END
都将使用 bash 命令 shell 运行ls -ls >myfiles
,并将使用lstlistings
此命令在文档中显示。我遇到的问题是,在逐字使用字符时,我在参数的开头和结尾都有换行符。我该如何摆脱它们?
这是我的代码(它基于tobiShell.sty
):
\lstdefinestyle{bash}{basicstyle={\ttfamily}}
\newwrite\ScriptFile
\edef\ScriptFileName{\jobname.sh}
% Store the argument into our script file.
\newcommand\generateScriptFile[1]{%
\immediate\openout\ScriptFile\ScriptFileName
\immediate\write\ScriptFile{#1}%
\immediate\closeout\ScriptFile
}
% Store the list of tokens in the argument into our script file
% and then list the contents of that file, prefixed by a "%".
\newcommand\listScriptFile[1]{%
% The following does not work as expected.
\generateScriptFile{\%\ignorespaces #1\unskip}\relax
\lstinputlisting[style=bash]{\bashescScriptFileName}\relax
\relax
}
\newcommand\bashDemo{\bashDemoI}
{% Define \bashDemoI
\catcode`\^^M=13%
\gdef\bashDemoI{%
\bgroup
\def\do##1{\catcode`##1 12\relax}%
\catcode`\^^M=13%
\def^^M{^^J}%
\dospecials%
\bashDemoII%
}%
}
{% Define \bashDemoII
\catcode`\@=0\relax%
@catcode`@\=12@relax%
@gdef@bashDemoII#1\END{@relax%
@generateScriptFile{#1}@relax%
@immediate@write18{bash@space@ScriptFileName@space}@relax%
@listScriptFile{#1}@relax%
@egroup@relax%
}@relax%
}
答案1
不是一个答案,而是一个建议:你正在研究所谓的文学编程:代码和文档包含在一个文件中,可以从中提取和处理代码和文档。(Donald Knuth 将 TeX 开发为一个文学程序,并创造了该术语。)
你可能想看看像这样的文学编程系统无网. 也许你听说过斯维夫,这是一个文学编程系统R语言。所有这些系统都使用 LaTeX 作为工具链的一部分,但也使用其他工具。文学编程可能在 Unix 系统上效果最好。
答案2
感谢温柔的 Martin Scharrer 为我提供了满意的答案。下面描述的解决方案并不像包中的代码那样通用ydoc
,但对我来说已经足够好了(我认为)。
诀窍是以bashDemoII
这样一种方式定义宏,使其吞噬内容前后的行尾字符,即,
@gdef@bashDemoII^^M#1^^M\END
然而,除非你这样做,否则这是行不通的
\catcode`\^^M\active
事先。因此,的完整定义\bashDemoII
如下:
\begingroup % Define \bashDemoII
\catcode`\@=0\relax%
@catcode`@\=12@relax%
@gdef@bashDemoII#1\END{@relax%
@generateScriptFile{#1}@relax%
@immediate@write18{bash@space@ScriptFileName@space}@relax%
@listScriptFile{#1}@relax%
@egroup@relax%
}@relax%
\endgroup