カスタム tcolorbox リストにキャプションとラベルを追加しますか?

カスタム tcolorbox リストにキャプションとラベルを追加しますか?

私は、Jupyter Notebook のコードに似たコードを表示するために、次のソリューションを使用しています。これは、ここから取得しました:リスト付きの IPython Notebook セル

結果は次のようになります。https://i.stack.imgur.com/C18GA.png (リンク先の投稿より)

可能性を追加する方法はありますか?キャプションとラベル箱に?

最小動作例:

\documentclass{article}
\usepackage{listings}

\usepackage[many]{tcolorbox}
\tcbuselibrary{listings}

\definecolor{light-gray}{gray}{0.95}


\newlength\inwd
\setlength\inwd{1.3cm}

\newcounter{ipythcntr}

\newtcblisting{ipythonnb}[1][\theipythcntr]{
    enlarge left by=\inwd,
    width=\linewidth-\inwd,
    enhanced,
    boxrule=0.4pt,
    colback=light-gray,
    listing only,
    top=0pt,
    bottom=0pt,
    overlay={
        \node[
        anchor=north east,
        text width=\inwd,
        font=\footnotesize\ttfamily\color{blue!50!black},
        inner ysep=2mm,
        inner xsep=0pt,
        outer sep=0pt
        ] 
        at (frame.north west)
        {\stepcounter{ipythcntr}In [#1]:};
    }
    listing options={
        basicstyle=\footnotesize\ttfamily,
        language=python,
        escapechar=¢,
        showstringspaces=false,
    },
}

\lstset{numbers=left, numberstyle=\tiny, stepnumber=1, numbersep=5pt}


\begin{document}

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Here are two IPython cells:
\begin{ipythonnb}
n = 10
\end{ipythonnb}

\begin{ipythonnb}
for i in range(n):
    print('i = ', i)
\end{ipythonnb}

\begin{ipythonnb}[13]
n = 10
\end{ipythonnb}

\end{document}

答え1

blend intoオプション ( の場合、listings定義を に入れる必要があることも意味します。理由についてはマニュアル\AtBeginDocument{...}を参照してください) を と一緒に使用できます。は対応する float カウンターを取得し、それに応じてタイトルを設定します。tcolorboxtitleblend into

コードにこれらの変更を加えると

\AtBeginDocument{
  \newtcblisting[blend into=listings]{ipythonnb}[2][\theipythcntr]{
    title=#2,
    enlarge left by=\inwd,
    ...
  }
}

および執筆

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.

Here are two IPython cells:
\begin{ipythonnb}{My caption}
n = 10
\end{ipythonnb}

\begin{ipythonnb}{Another caption}
for i in range(n):
    print('i = ', i)
\end{ipythonnb}

\begin{ipythonnb}[13]{And another one}
n = 10
\end{ipythonnb}

我々が得る

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


キャプションをタイトルではなく外側に表示したい場合は、例えば次のようにします。comment above* listing その代わりlisting only独立したタイトルと一緒に:

\AtBeginDocument{
  \newtcblisting[blend into=listings]{ipythonnb}[2][\theipythcntr]{
    title=#2,
    detach title,
    coltitle=black,
    comment above* listing,
    comment=\centering\tcbtitle,
    enlarge left by=\inwd,
    ...
  }
}

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


コードを次のように変更すると

\AtBeginDocument{
  \newtcblisting[blend into=listings]{ipythonnb}[2][lst:\thelstlisting]{
    label=#1,
    title=#2,
    ...
    {\stepcounter{ipythcntr}In [\theipythcntr]:};
    ...
  }
}

と入力

Here are two IPython cells:
\begin{ipythonnb}{My caption}
n = 10
\end{ipythonnb}

\begin{ipythonnb}[lst:another]{Another caption}
for i in range(n):
    print('i = ', i)
\end{ipythonnb}

\setcounter{ipythcntr}{12}
\begin{ipythonnb}{And another one}
n = 10
\end{ipythonnb}

see listing~\ref{lst:another}

ラベルも使用できます:

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


最後の例の完全なコード:

\documentclass{article}
\usepackage{listings}

\usepackage[many]{tcolorbox}
\tcbuselibrary{listings}

\definecolor{light-gray}{gray}{0.95}


\newlength\inwd
\setlength\inwd{1.3cm}

\newcounter{ipythcntr}

\AtBeginDocument{
  \newtcblisting[blend into=listings]{ipythonnb}[2][lst:\thelstlisting]{
    label=#1,
    title=#2,
    detach title,
    coltitle=black,
    comment above* listing,
    comment=\centering\tcbtitle,
    enlarge left by=\inwd,
    width=\linewidth-\inwd,
    enhanced,
    boxrule=0.4pt,
    colback=light-gray,
    top=0pt,
    bottom=0pt,
    overlay={
        \node[
        anchor=north east,
        text width=\inwd,
        font=\footnotesize\ttfamily\color{blue!50!black},
        inner ysep=2mm,
        inner xsep=0pt,
        outer sep=0pt
        ] 
        at (frame.north west)
        {\stepcounter{ipythcntr}In [\theipythcntr]:};
    }
    listing options={
        basicstyle=\footnotesize\ttfamily,
        language=python,
        escapechar=¢,
        showstringspaces=false
    }
  }
}
\lstset{numbers=left, numberstyle=\tiny, stepnumber=1, numbersep=5pt}


\begin{document}

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.

Here are two IPython cells:
\begin{ipythonnb}{My caption}
n = 10
\end{ipythonnb}

\begin{ipythonnb}[lst:another]{Another caption}
for i in range(n):
    print('i = ', i)
\end{ipythonnb}

\setcounter{ipythcntr}{12}
\begin{ipythonnb}{And another one}
n = 10
\end{ipythonnb}

see listing~\ref{lst:another}

\end{document}

関連情報