我正在使用\iteminput
解决方案中的宏如何调整宏来尊重当前的\linewidth?导入其他 TeX 文件的内容。但是,这似乎影响了文本的缩进\intertext{}
。下面的红色文本就是问题所在。
使用常规\input
方法时,效果很好,文本按预期左对齐,如 (a) 所示。但是,使用宏时,\iteminput
文本\intertext
向右移动,如 (b) 所示:
我发现,如果我\vtop{}
从\iteminput
宏中删除,我就会得到所需的行为。但由于这是来自埃格尔解决方案,我不愿意这样做,因为不知道这是否会导致其他问题。
参考:
代码:
\documentclass{article}
\usepackage{showframe}
\usepackage{xcolor}% to highlight the problem area in the output
\usepackage[fleqn]{amsmath}
\usepackage{enumitem}
\usepackage{filecontents}
\begin{filecontents*}{foo.tex}
Two well known equations are:
\begin{alignat*}{3}
E & = mc^2 \\
\intertext{\textcolor{red}{and}}
F &= ma
\end{alignat*}
\end{filecontents*}
\newcommand{\MyInput}[1]{%
\begingroup% The grouping here is not currently causing a problem.
\input{#1}% But do need grouping here (for a unrelated reason).
\endgroup%
}%
% https://tex.stackexchange.com/questions/18247/how-to-adjust-macro-to-respect-current-linewidth/
\newcommand{\iteminput}[2][\topskip-1bp]{%
\leavevmode%
\vtop{% Removing this fixs the problem.
\hsize=\noexpand\linewidth\hrule height 0pt\kern-\dimexpr#1\relax%
\MyInput{#2}%
}%
}%
\begin{document}
\begin{enumerate}[label={(\alph*)}]
\item \input{foo} % This works great
\item \iteminput[2.5ex]{foo} % This shifts "and" to right!!
\end{enumerate}
\end{document}
答案1
问题是最初的解决方案已经是错误的,并且在这种特殊情况下它会显示出来。\vtop
不是 LaTeX 命令,所以如果你使用它,你需要完全理解它的作用和不的作用。
重要的是它没有做什么:它没有设置一个新的框画廊,忽略任何外部情况,例如在枚举内部。因此,这个事实在内部仍然可见,\intertext
因此假定它必须缩进其文本。然而,文本已经缩进,原因很简单,因为整个框都是缩进的。所以一个快速修复仅适用于您的具体情况将会
\makeatletter
% http://tex.stackexchange.com/questions/18247/how-to-adjust-macro-to-respect-current-linewidth/
\newcommand{\iteminput}[2][\topskip-1bp]{%
\leavevmode%
\vtop{% Removing this fixs the problem.
\hsize=\noexpand\linewidth\hrule height 0pt\kern-\dimexpr#1\relax%
\@totalleftmargin\z@ % cancel any line indentation
\MyInput{#2}%
}%
}%
\makeatother
但这当然也是不对的,通过观察我们可以看出\@arrayparboxrestore
在这种情况下 LaTeX 真正重置了什么。
归根结底,对于一般解决方案,您最好使用 minipage 环境(它可以处理所有这些问题,因为它可以与其他 LaTeX 构造一起使用)。或者,您真的必须付出更多努力才能将您的命令与 LaTeX 的内部结构融合在一起。