在 verbatim/listings 中忽略空格和取消跳过?

在 verbatim/listings 中忽略空格和取消跳过?

我正在编写一个\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

相关内容