\subfile 扩展了强大的命令(因此在这方面与 \input 不同)

\subfile 扩展了强大的命令(因此在这方面与 \input 不同)

_在非数学中将其作为不可破坏的破折号超载,并且这不会造成任何问题\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未找到该文件。

相关内容