给定以下文件:
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}