I am writing a \bashDemo
macro that will (a) execute its argument in a shell, e.g., bash, script, and (b) display the argument in a listings. So,
\bashDemo
ls -ls > myfiles
\END
will both run ls -ls >myfiles
using the bash command shell, and will display using lstlistings
this command within the document. The problem I have is that in consuming characters in a verbatim fashion, I have a newline both at the beginning and at the end of the argument. How do I get rid of these?
Here is my code (it is based on 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%
}
ydoc
which does something similar. I remove the trailing and leading new lines as well there.\def\do##1{\catcode`##1 12\relax}
with\let\do\@makeother
and\catcode`\^^M=13
with\catcode`\^^M\active
. I think you want\@percentchar
instead of\%
. The verbatim\END
could be more easily inserted using the common\lcchar
/\lowercase
trick. I like\begingroup
/\endgroup
much more then the{
,}
for this kind of definitions, because they are much more readable.ydoc
I have an own definition of themacrocode
environment. If it is empty the leading and trailing new-lines are the same! :-)