\addxcontentsline は、ページ区切りの前の mdframed ボックスの一部を空にします。

\addxcontentsline は、ページ区切りの前の mdframed ボックスの一部を空にします。

私は、 (この例では)とmdframed呼ばれる独自の環境を囲むためにを使用しています{myenv}。この環境はトリオ リストとして設定されており、これらの環境のリストを書き込むために を使用しています( MWE にのみ\addxcontentsline使用しています)。doc

問題

問題

ボックスはページをまたいで分割されており、最初のページの上部は空のままになっています。

コード/MWE

\documentclass{scrbook}

\usepackage{xparse}
\usepackage[framemethod = TikZ]{mdframed}

\ExplSyntaxOn\makeatletter

% define a style
\mdfdefinestyle { mystyle } {
   backgroundcolor = yellow,
   innertopmargin = 0.55\baselineskip,
   skipabove = 1\baselineskip \@plus 1ex,
}

% define the environment
\NewDocumentEnvironment { myenv } { } {
   \list { } { }
      \item \relax
      \addxcontentsline { toc } { myenv } [ X ] { }% <---------------- [A]
      { \bfseries My~Env~No.~X }% <----------------------------------- [B]
      \par \nopagebreak
} {
   \endlist
}
% souround it with an md frame
\surroundwithmdframed[ style = mystyle ] { myenv }

%% for testing
%\long\def\protected@write#1#2#3{%
%      \begingroup
%       \let\uthepage\relax
%       #2%
%       \let\protect\@unexpandable@protect
%       \edef\reserved@a{\write#1{#3}}% <------+---------------------- [C]
%       \reserved@a% <-------------------------'
%      \endgroup
%      \if@nobreak\ifvmode\nobreak\fi\fi
%}

\ExplSyntaxOff\makeatother

\usepackage{lipsum}

\begin{document}
   \lipsum[1] \vspace{110mm} \lipsum[2]
   \begin{myenv}
      \lipsum*[2]
   \end{myenv}
\end{document}

私が

  • マークされた行を削除(またはコメントアウト)します。[A] または
  • マークされた行を削除(またはコメントアウト)します[B](ただし、これについてはよくわかりません)または
  • 行の順序を入れ替え[A][B]

さらに、問題を次のように追跡しました。削除 (コメント アウト) すると、問題が\protected@writeマークされている 2 行も消えます。[C]

質問

  1. この問題の最善の解決策は何ですか? 問題なく切り替えることはできます[A][B]?
  2. mdframedこれは報告すべきバグでしょうか?

ノート

  • の元の定義は{myenv}より複雑です。
  • \newmdenvとについては知っています\newmdtheoremenvが、これには使用できません。
  • [A]前の行を移動して\listも違いはありません。

答え1

\color{green}の代わりに を使用した場合も同じ結果になります\addxcontentsline { toc } { myenv } [ X ] { }\leavevmodeの後にまず を発行してみてください\item\relax

関連情報