我的情况
itemize
我有一个由一组minipage
(或varwidth
,无论......)组成的环境
我们把这个称为环境myItemize
。
我在垂直间距方面遇到了困难\end{myItemize}
(我不关心之前的垂直间距\begin{
)
所有代码都在最后。
myItemize
:之后有常规间距
通过摆弄myItemize
定义,我可以让它在“常规文本”。
插图 :
\item
前后间距myItemize
:不可以
如果myItemize
嵌套在itemize
,则特别指定间距不再相关。
有人可以向我展示在两种情况下施展魔法才能使之后的间距myItemize
与之后的间距相同吗?itemize
我尝试了一下,\ignorespacesafterend
但没有成功!
插图 :
代码
\documentclass[12pt]{article}
\begin{document}
\newenvironment{myItemize}
{%
\noindent
\begin{minipage}{\linewidth}
\begin{itemize}
}
{%
\end{itemize}
\strut
\end{minipage}
\vspace{-2.3\baselineskip}
\vspace{-\lineskip}
\strut
}
\newcommand\myCommand[2]
{
\begin{minipage}{.5\linewidth}
\begin{#1}
\item this is #2
\item spacing below is about \textsc{ok}
\end{#1}
dummy below
\hrulefill
\end{minipage}
}
\myCommand{myItemize}{{\verb!myItemize}}%
\myCommand{itemize}{{\verb!itemize}}
\begin{itemize}
\item dummy item
\begin{itemize}
\item this is \verb!itemize!
\item spacing is \textsc{ok}
\end{itemize}
\item dummy item
\begin{myItemize}
\item this is \verb!myItemize!
\item spacing below is not \textsc{ok}
\item I don't care about above spacing
\end{myItemize}
\item dummy item
\end{itemize}
\end{document}
干杯,
答案1
\begin
首先,在环境中使用。您的原始代码将扩展为:
\begin{MyItemize}
\begin{minipage}
\begin{itemize}
\end{MyItemize}
\end(itemize}
\end{minipage}
这是不正常的。(\end
测试)\@currenvir
#1
其次,除了在 vmode 中时,\item
添加\itemsep
。因此,问题的一部分是如何避免在不添加额外行的情况下处于 vmode 中。无论如何,解决方案是将 添加到itemize 的\strut
最后\item
而不是末尾。
第三,itemize 以 skip 结尾,而 minipage 没有。我能找到的唯一一种\myCommand
不添加行就能修复对齐的方法是使用\unskip
in \myCommand
,然后将 skip 放回去。(实际上,删除的 skip 是13.0pt plus 6.0pt minus 8.0pt
whereas \baselineskip=14.5pt
。我还没能识别 itemize 使用的 skip 的名称。)
\documentclass[12pt]{article}
\newenvironment{myItemize}
{%
\noindent
\minipage{\linewidth}\null
\itemize
}
{%
\strut\enditemize
\endminipage
}
\newcommand\myCommand[2]
{
\begin{minipage}[t]{.5\linewidth}\null
\begin{#1}
\item this is #2
\item spacing below is about \textsc{ok}
\end{#1}\unskip\par\vskip\baselineskip
dummy below \the\parskip
\hrulefill
\end{minipage}
}
\begin{document}
\myCommand{myItemize}{myItemize}%
\myCommand{itemize}{itemize}
\begin{itemize}
\item dummy item
\begin{itemize}
\item this is \verb!itemize!
\item spacing is \textsc{ok}
\end{itemize}
\item dummy item \smash{\rule{1pt}{\dimexpr\baselineskip+\itemsep}}
\begin{myItemize}
\item this is \verb!myItemize!
\item spacing below is not \textsc{ok}
\item I don't care about above spacing
\end{myItemize}
\item dummy item \smash{\rule{1pt}{\dimexpr\baselineskip+\itemsep}}
\end{itemize}
\end{document}
答案2
我可能在这个问题上没有很好地解释自己。
如果环境后面跟着 ,那么 John 的解决方案是可以的\item
,但对于常规文本则不行,但我希望“后” vspace
无论如何都是正确的。
我从David Carlisle 的解决方案,有条件地摆脱\baselineskip
由引入的额外内容\item
。
输出
代码
\documentclass[12pt,border=5pt]{standalone}
\makeatletter
\def\detectItem{%
\@ifnextchar\item%
{\par\kern-\baselineskip}%
{}%
}
\makeatother
\def\useDetectItem#1\ignorespaces\fi{#1\fi\detectItem}
\newenvironment{myItemize}
{%
\noindent
\minipage{\linewidth}
\itemize
}
{%
\strut%\smash{\rule[\dimexpr-\baselineskip-\itemsep]{1pt}{1cm}}
\enditemize
\endminipage%
\par\kern\dimexpr\baselineskip-.7\lineskip\relax
\aftergroup\useDetectItem}
\newcommand\myCommand[2]
{%
\begin{minipage}{.5\linewidth}
\begin{#1}
\item this is {\verb!#2}
\item spacing below is \textsc{ok}
\end{#1}
dummy below
\hrulefill
\end{minipage}%
}
\begin{document}
\begin{minipage}{390pt}
\myCommand{myItemize}{myItemize}%
\myCommand{itemize}{itemize}
\begin{itemize}
\item dummy item
\begin{itemize}
\item this is \verb!itemize!
\item spacing is \textsc{ok}
\end{itemize}
\item dummy item \smash{\rule{1pt}{\dimexpr\baselineskip+\itemsep}}
\begin{myItemize}
\item this is \verb!myItemize!
\item spacing below is now \textsc{ok}
\item I don't care about above spacing
\end{myItemize}
\item dummy item \smash{\rule{1pt}{\dimexpr\baselineskip+\itemsep}}
\end{itemize}
\end{minipage}
\end{document}