C#/hello.cs

C#/hello.cs

给定以下文件:

book.tex

\documentclass{memoir}
\usepackage{listings}

\begin{document}
\lstlistoflistings
\chapter{Hello, world!}
\lstinputlisting{C\#/hello.cs}
\end{document}

C#/hello.cs

using System;

class Hello {
    static void Main(string[] args) {
        Console.WriteLine("Hello, world!");
    }
}

C#/hello.cs将文件作为列表包含在内的正确语法是什么book.tex

我尝试了这些变体,但都失败了:

  • \lstinputlisting{C#/hello.cs}
  • \lstinputlisting{C\#/hello.cs}

当我尝试第一个变体时\lstinputlisting{C#/hello.cs},出现以下错误:

! Illegal parameter number in definition of \reserved@a.
<to be read again> 
/
l.7 \lstinputlisting{C#/hello.cs}
                               
? 

当我尝试第二种变体时\lstinputlisting{C\#/hello.cs},出现以下错误:

! Missing \endcsname inserted.
<to be read again> 
#
l.7 \lstinputlisting{C\#/hello.cs}
                                
? 

lualatex我在、pdflatex和中得到了相同的行为和(几乎)相同的错误消息xelatex

我试图通过阅读 listings 包的文档来找到解决方案https://mirror.mwt.me/ctan/macros/latex/contrib/listings/listings.pdf。唉呀,徒劳无功。

正确使用方法是什么列表包中包含#路径名带有 - 字符的文件?(作为一种解决方法,我当然可以将目录从 重命名C#Csharp,但我想解决问题,不是避免它。)

答案1

不幸的是,作者listings可能没有考虑到这种情况,因此实际上没有“正确”的解决方案。

如果你坚持的话,我认为有两种方法。

方法 1. 补丁\lstinputlisting允许\#

你可以这样做...

\let\oldlstinputlisting\lstinputlisting
\def\lstinputlisting#1{%
    \begingroup
    \escapechar=-1
    \expandafter \endgroup
    \expandafter \oldlstinputlisting
    \expandafter {\detokenize{#1}}%
}

然后做一些类似的事情......

\lstinputlisting{\#.txt}

但一个可能的缺点是,像这样的代码\def\filename{myfile.txt}\lstinputlistings{\filename},在补丁之前可以工作,但现在却不行了。(它也可能会破坏其他东西,我不知道。)

#方法 2.注入catcode-other

参考。字符 - 如果 \@percentchar 代表 %,那么是否有 # 的宏? - TeX - LaTeX Stack Exchange

\edef\hashchar{\string#}

\lstinputlisting{\hashchar.txt}

\hashchar在需要 的任何地方使用#

(此方法确实隐式地依赖于\lstinputlisting“完全扩展”参数,但这更有可能,因为原语\input等对文件名确实如此。否则,将 catcode-other-token#放入参数本身是可能的,但有点困难)

答案2

方法3:使用\string##代替\#,即:

\lstinputlisting{C\string##/hello.cs}

相关内容