背景:
我已经命名了“部分”(部分(本题的其余部分)这些按钮会根据参数有条件地显示或隐藏。为了简化下面的测试用例,这些按钮由\def
以下三个按钮控制\begin{document}
。
这些中的每一个部分应该能够控制它们是排版在新段落中还是从上一个段落继续。这似乎对 3/4 的情况都有效。我遇到的问题是,如果最后启用部分结束于显示数学环境,和下列部分希望始终显示为新段落(即不是像本段一样继续作为上一段的一部分IntroDetails
。
问题:
下面的 MWE 重现了问题案例,你可以看到Summary
段落开始的位置比它应该的位置靠后。为了更清楚地看到这一点,你可以看到其他有效的案例,即注释掉的任意组合最后一个以下的:
\def\EndWithDisplayMath{}%
\def\SupressIntroDetails{}%
因此,我需要的是一个宏,它重新定义\par
最后排版的内容是否以显示数学结尾。我想为宏添加智能,\NamedSection
以便每个命名的内容部分不需要考虑之前排版的内容是否以显示的数学结束。
笔记:
- 如果相关,部分是总是按照它们在文档中出现的顺序进行排版,但每个部分可以独立于其他进行排版或抑制。
- 我尝试在某个环境中重现该问题,以便更容易地看到问题间距,但在?
minipage
中一切似乎都运行良好。minipage
参考:
- 我正在使用修改的解决方案的版本来自删除末尾的多余空间消除垂直空间,如果部分以显示数学方程式结束。修改是删除最有可能与不太正常工作
\par
相关的。\RemoveSpaceAtEnd
代码:
\def\EndWithDisplayMath{}% Problem ONLY if BOTH of these are uncommented.
\def\SupressIntroDetails{}%
\documentclass{article}
\usepackage{showframe}
\usepackage{parskip}
\usepackage{xparse}
% https://tex.stackexchange.com/questions/45943/remove-excess-space-at-end
\newcommand{\RemoveSpaceAtEnd}[1]{%
\begingroup
\advance\belowdisplayskip1sp
\advance\belowdisplayshortskip1sp
%\par% Removed this from solution from 45943
#1%
%\par% Removed this from solution from 45943
\ifdim\lastskip=\belowdisplayshortskip
%\typeout{display here (short)}%
\nobreak
\vskip-\belowdisplayshortskip
\else
\ifdim\lastskip=\belowdisplayskip
%\typeout{display here \noexpand#1}%
\nobreak
\vskip-\belowdisplayskip
\fi
\fi
\endgroup
}
\NewDocumentCommand{\NamedSection}{%
m% {#1} = name for sub-section
+m% {#2} = content ("+" can have para)
}{%
\ignorespaces%
\ifcsname#1\endcsname%
\RemoveSpaceAtEnd{#2}%
\fi%
\ignorespacesafterend%
}
\begin{document}
% Control which sections to display:
\def\Intro{}%
\ifdefined\SupressIntroDetails
\else
\def\IntroDetails{}%
\fi
\def\Summary{}%
\NamedSection{Intro}{%
First we introduce the topic.
\ifdefined\EndWithDisplayMath
\[
E = mc^2.
\]
\fi
}%
\NamedSection{IntroDetails}{%
Followed by more intro details.
}%
%
% Leaving a blank line here works fine, except if "IntroDetails" are supressed.
\NamedSection{Summary}{%
% Want this to start on its own line.
\par% Using \par works fine, except if "IntroDetails" are supressed.
And finally summarize the topic.
}%
\end{document}
答案1
据我所知,你只是想把我的\par
背放回去,然后
\NewDocumentCommand{\NamedSection}{%
m% {#1} = name for sub-section
+m% {#2} = content ("+" can have para)
}{%
\ignorespaces%
\ifcsname#1\endcsname%
\RemoveSpaceAtEnd{#2}%
\fi%
\ignorespaces%afterend%
}
如果您有时需要将部分放在段落中间,那么您可以将使用限制\par
在水平列表的开头,这意味着它要么在$$
或之后\noindent
(或者您处于内部列表中,\par
无论如何都不执行任何操作)要么您正在做一些非常鬼鬼祟祟的事情。
\makeatletter
\advance\belowdisplayskip1sp
\advance\belowdisplayshortskip1sp
\newcommand{\RemoveSpaceAtEnd}[1]{%
%\par% Removed this from solution from 45943
#1%
\def\next{}%
\ifhmode\ifnum\lastnodetype=-1\par
\let\next\@doendpe
\fi% Removed this from solution from 45943
\ifdim\lastskip=\belowdisplayshortskip
%\typeout{display here (short)}%
\nobreak
\vskip-\belowdisplayshortskip
\else
\ifdim\lastskip=\belowdisplayskip
%\typeout{display here \noexpand#1}%
\nobreak
\vskip-\belowdisplayskip
\fi
\fi
\next
}