如何显示带有下划线的文件名。

如何显示带有下划线的文件名。

以下 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

相关内容