我_
在非数学中将其作为不可破坏的破折号超载,并且这不会造成任何问题\input
:
\documentclass{article}
\usepackage{babel}
\let\subscr=_
\catcode`_=\active
\DeclareRobustCommand_{\ifmmode\subscr\else\babelhyphen{nobreak}\fi}
\begin{document}
a_b ; \input{a_b.tex}
\end{document}
使用空文件a_b.tex
,可以成功编译。
但是,更改\input
为\subfile
会产生错误:
\documentclass{article}
\usepackage{babel}
\usepackage{subfiles}
\let\subscr=_
\catcode`_=\active
\DeclareRobustCommand_{\ifmmode\subscr\else\babelhyphen{nobreak}\fi}
\begin{document}
a_b ; \subfile{a_ab.tex}
\end{document}
这将触发:
! Undefined control sequence.
\filename@simple #1.\\->\edef \filename@base
{#1}
l.8 a_b ; \subfile{a_ab.tex}
一种不需要修改使用的解决方法是暂时\subfile{}
恢复的 catcode :_
% In preamble:
\makeatletter
\let\@sf=\subfile
\let\@sfs=\subfiles@subfile
\renewcommand\subfile{\catcode`_=8\@sf}
\def\subfiles@subfile#1{\catcode`_=\active\@sfs{#1}}
\makeatother
作为参考,这是更改的 Subfiles 包的代码:
\newcommand\subfile{%
\let\subfiles@loadfile\subimport
\subfiles@subfile
}
\def\subfiles@subfile#1{%
\begingroup
\subfiles@handleSubDocument
\subfiles@split{#1}%
\subfiles@loadfile{\filename@area}{\filename@base}%
\endgroup
}
问题:有没有更简洁的解决方案,可以\subfile
以类似的方式解析其参数\input
? 这会迫使它称其为错误subfiles
吗?
答案1
\edef
代码中有一个“raw” subfiles
,而不是使用\protected@edef
。LaTeX 健壮机制仅适用于\protected@edef
和朋友。同时,我们需要提供一个_
可以在文件名内部工作的 的定义:可以使用\ifincsname
(出于技术原因)来完成:
\documentclass{article}
\usepackage{babel}
\usepackage{subfiles}
\usepackage{etoolbox}
\let\subscr=_
\catcode`_=\active
\protected\def_{\ifincsname\string_\else
\ifmmode\subscr\else\babelhyphen{nobreak}\fi\fi}
\begin{document}
a_b ; \subfile{a_ab.tex}
\end{document}
在我的系统上出现预期错误:a_ab.tex
未找到该文件。