垂直方向のスペースをブロックして余白の重なりを防ぐ

垂直方向のスペースをブロックして余白の重なりを防ぐ

先ほど使った例を考えてみましょう

Tikz: 他のノードの右マージンにあるノードは tcbtheorem と相互作用します

これは、TikZ を使用して余白のメモの周囲に色付きのボックスを描画するコマンドです。

このメモは TikZ によって描画されるため、余白コンテンツとして認識されず、たとえばサイドノートと重なる可能性があります。

例えば:

\documentclass[oneside]{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tikzpagenodes}
\usepackage[most]{tcolorbox}
\tcbuselibrary{theorems}
\usepackage{lipsum}
\usepackage{marginfix}
\usepackage{sidenotes}


\newcounter{mycaution}
\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay]
  \node[inner xsep=0pt,outer sep=0pt] (#1) {};
}

\newcommand{\caution}{
\stepcounter{mycaution}
\tikzmark{\themycaution}%

\begin{tikzpicture}[remember picture,overlay]
\node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]   
  (mybox\themycaution)
  at ([yshift=3pt]current page text area.east|-\themycaution) 
  {\parbox{\marginparwidth}{Some text, even a longer text}};
\end{tikzpicture}
}


\begin{document}


Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum
ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero,
nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna fringilla
ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in,
pretium quis, viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus. Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor
semper nulla. Donec varius orci eget risus. Duis nibh mi, congue eu, accumsan eleifend,
sagittis quis, diam. Duis eget orci sit amet orci dignissim rutrum.
Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem
non justo. Nam\sidenote{Random sidenote with a bit long text.} lacus libero, pretium at, lobortis vitae, ultricies et, tellus. Donec aliquet,
tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi.\caution{}
Morbi ac orci et nisl hendrerit mollis. Suspendisse ut massa. Cras nec ante. Pellentesque a
nulla. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Aliquam tincidunt urna. Nulla ullamcorper vestibulum turpis. Pellentesque cursus
luctus mauris.



\end{document}

結果:

ここに画像の説明を入力してください

cautionこのような動作を回避するには、余白のボックスの高さを「ブロック」して、そこに他のものが入らないようにします。パッケージmarginfixパッケージには、\marginphantom私が必要としていると思われるコマンドが用意されています。ただし、定義の直前(または定義内)\marginphantom{2cm}に追加しても機能しません。cautiontikzpicture\tikzmark

caution他の余白素材と重ならないように、余白でボックスに必要なスペースをブロックするための別の解決策を思いつきますか(\marginparまたはを考えています\sidenote)。 (さらに、 の使用のどこが間違っているのか説明していただけると大変ありがたいです\marginphantom)。

編集

説明: コマンドが\tikzmarkここで定義され使用されるのは、ボックスがcaution呼び出される正確な場所にあるようにするためです。

さらに、必要なボックスは単なる赤いボックスよりも複雑なので、それをプロットするには TikZ が必要であり、 のようなものは使用できませんcolorbox

答え1

重複を避ける最も簡単な方法は、の定義内tikzpictureで 自体を で囲むことです。\sidenote\caution

\sidenote{%
  \tikzpicture[remember picture]
    \node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]   
    (mybox\themycaution)
    at ([yshift=3pt]current page text area.east|-\themycaution) 
    {\parbox{\marginparwidth}{Some text, even a longer text}};
  \endtikzpicture
}

この場合、「オーバーレイ」オプションをキャンセルする必要があることに注意してください。

ここで、これらのサイドノートの番号付けを無効にし、カウンターの増加を抑制する必要がありますsidenote

\newcommand{\caution}{%
  ...
  \begingroup
  \let\thesidenote\relax
  \let\refstepcounter\@gobble
  \sidenote{%
    ...
  }
  \endgroup
}

出力

完全なコード

\documentclass[oneside]{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tikzpagenodes}
\usepackage[most]{tcolorbox}
\tcbuselibrary{theorems}
\usepackage{lipsum}
\usepackage{sidenotes}
\usepackage{marginfix}

\newcounter{mycaution}
\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay]
  \node[inner xsep=0pt,outer sep=0pt] (#1) {};
}

\makeatletter
\newcommand{\caution}{%
  \stepcounter{mycaution}%
  \tikzmark{\themycaution}%
  \begingroup
  \let\thesidenote\relax
  \let\refstepcounter\@gobble
  \sidenote{%
    \tikzpicture[remember picture]
      \node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]   
      (mybox\themycaution)
      at ([yshift=3pt]current page text area.east|-\themycaution) 
      {\parbox{\marginparwidth}{Some text, even a longer text}};
    \endtikzpicture
  }%
  \endgroup
}
\makeatother

\begin{document}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum
ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero,
nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna fringilla
ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in,
pretium quis, viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus.\caution Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor
semper nulla. Donec varius orci eget risus. Duis nibh mi, congue eu, accumsan eleifend,
sagittis quis, diam. Duis eget orci sit amet orci dignissim rutrum.
Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem
non justo. Nam\sidenote{Random sidenote with a bit long long long long long long long long long long long long text.} lacus libero, pretium at, lobortis vitae, ultricies et, tellus. Donec aliquet,
tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi.\caution
Morbi ac orci et nisl hendrerit mollis. Suspendisse ut massa. Cras nec ante. Pellentesque a
nulla. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Aliquam tincidunt urna. Nulla ullamcorper vestibulum turpis. Pellentesque cursus
luctus mauris.
\end{document}

関連情報