我正在使用LaTeX-KOMA 模板(顾名思义,基于 KOMA 脚本)由 Karl Voit 提供,用于撰写论文。我可以完美地编译 main.tex,直到我导入包syntax
。即使我“按原样”编译模板,而不导入任何其他包,也会发生这种情况。我收到以下错误,我简直无法理解:
! 缺少插入的 \endcsname。\protect l.232 \input{template/declaration_TU_Graz} %% 法定声明 标记的控制序列不应出现在 \csname 和 \endcsname 之间。
!Extra \endcsname.\InputIfFileExists ...\csname #1-@alias\endcsname \relax \expandafter \@seco... l.232 \input{template/declaration_TU_Graz} %% 法定声明 我忽略了这一点,因为我没有做 \csname。
!TeX 容量超出,抱歉 [输入堆栈大小=5000]。\@inmathwarn ...latex@warning {命令 \protect #1 在数学模式下无效}\fi l.232 \input{template/declaration_TU_Graz} %% 法定声明如果您确实需要更多容量,可以请向导来扩大我。
仅通过导入包怎么会发生这种情况syntax
?
如何重现:
- 下载LaTeX-KOMA 模板并提取它
- 排版 main.tex -> 它按预期工作
- 插入到main.tex的
\usepackage{syntax}
指定区域MISC usepackages
- 再次排版main.tex -> 出现错误。
系统:在 MacTex-2015(TeX Live 2015)上运行 texmaker 4.4.1,无需任何包更新,即可在 OS X Yosemite 10.10.3 上运行。
如果您需要任何其他信息,请告诉我!
答案1
语法包重新定义了下划线字符,因此当您在文件名中使用它时,它不会被按原样读取,而是被解释为宏并展开。 简单的解决方案:避免在文件名中使用下划线。
不太理想的解决方案:在包改变其含义之前(在开始文档时),在宏中捕获原始下划线字符syntax
,然后使用宏代替下划线:
\documentclass{article}
\usepackage{syntax}
\let\UnderScore_
\begin{document}
\input{bla\UnderScore bla}
\end{document}
更通用的解决方案_
:恢复(可能在本地)使用的含义
\catcode`\_=11
这将使_
角色恢复正常。你可以重新激活syntax
的重新定义,方法是:
\catcode`\_=\active
您可以将这两个放在两个宏中\makeunderscoreletter
并\makeunderscoreactive
在本地使用:
\documentclass{article}
\usepackage{syntax}
\newcommand{\makeunderscoreletter}{\catcode`\_=11}
\newcommand{\makeunderscoreactive}{\catcode`\_=\active}
\begin{document}
\makeunderscoreletter
\input{bla_bla} % interprets _ as letter
\makeunderscoreactive
my_variable % uses syntax redefinition
\end{document}
答案2
为了扩展已接受的答案,该syntax
包还有一个可选参数nounderscore
,专门用于修复此问题。使用加载包可以\usepackage[nounderscore]{syntax}
解决您的问题。