以下 latex 代码使用 fancyvrb VerbatimOut 和 VerbatimInput 环境来写出和显示代码。其想法是只维护一个包含代码和文档的 latex 文件,并且不需要额外的文学编程软件(例如 noweb),而只需要 latex。它适用于没有下划线的文件名(例如:“createx.m”),但代码在其他情况下会失败(例如“create_x.m”)。有什么建议可以解决这个问题吗?谢谢!
\documentclass{article}
\usepackage{upquote} % to type set code properly for copy and
% pasting from the PDF
\usepackage{fancyvrb} % to write out verbatim stuff
\newcommand{\fname}{} % for code environment to write out the code
\newenvironment{code}[1]{%
\renewcommand{\fname}{#1}
\VerbatimOut{\fname}}{%
\endVerbatimOut
%\vspace*{-1em}
\raggedright{\emph{\fname}}
\VerbatimInput{\fname}}
\begin{document}
The code snippets are in Matlab which is not relevant to the problem.
\begin{code}{createx.m}
randn('state', 0);
rand('state', 0);
x = double(imread('~/lena.png'));
\end{code}
More text to see how much space is before and after the code snipppet.
\end{document}
附加信息:我确实尝试过 catcodes,但困难在于带下划线的文件名作为参数传递,并在“\raggedright{\emph{\fname}}”行中展开。如果我省略该行,代码也适用于下划线。但是,“newenvironment”的目的是同时显示文件名。
答案1
\raggedright
不接受参数,所以你在这里误用了它。它似乎也没有必要。
一种可能的解决方案是用 替换该行
\raggedright{\emph{\fname}}
,\par\printname
然后定义\printname
如下。
\begingroup
\catcode`_\active
\gdef\printname{%
\begingroup
\catcode`_\active
\let_\textunderscore
\noindent\itshape
\scantokens\expandafter{\fname}%
\endgroup
}
\endgroup
答案2
我以前在使用该包时遇到过类似的问题listings
- 简单的解决方案是转义下划线:该文件create_x.m
应在乳胶文档中引用为create\_x.m
。