在跨越多页的文本左侧添加边框

在跨越多页的文本左侧添加边框

我想在一些缩进的文本左侧添加边框,最终跨越多页嵌套。我的目标类似于校样内部的压痕水平但我当时找到的解决方案对跨多页的文本不起作用。我尝试过,mdframedtcolorbox对跨多页的嵌套框有问题(例如,内部框从新页面开始)。

同时,我找到了一个命令adjustwith,可以让我以一种非常简单和强大的方式缩进我的文本。但我仍然不知道如何在文本左侧添加垂直线。

这是我想要的:

在此处输入图片描述

我目前所拥有的:

在此处输入图片描述

梅威瑟:

\documentclass{article}
\usepackage{changepage}% http://ctan.org/pkg/changepage
\usepackage{lipsum}% http://ctan.org/pkg/lipsum

\newenvironment{subproof}{\begin{adjustwidth}{2.5em}{0pt}}{\end{adjustwidth}}

\begin{document}
\section{Title}
I would like to add a black border on the left of all ``adjustwidth'' blocks:
\begin{subproof}
  \lipsum[1]
  \begin{subproof}
    \lipsum[1-2]
    \[\Delta = b^2 - 4ac\]
    \lipsum[1-2]
  \end{subproof}
  \lipsum[1]
\end{subproof}
\lipsum[1]
\end{document}

编辑:我刚刚听说了这个changebar包,它的功能与我想要的非常接近……只是我不知道如何多次更改行的位置。事实上,如果我\changebarsep在文档开头之后进行更改,行的位置不会改变……我本来想根据自己的需要修改这个包,但我还不确定该怎么做……

编辑2:

muzimuzhi 的提议不起作用,因为当嵌套的子校样大于一页时,它会移动到下一页(在第一页留下一点空白),并且这些条有点难看,因为在下一页上内条比外条长:

在此处输入图片描述

产生此结果的代码:

\documentclass{article}
\usepackage{lipsum}
\usepackage{tcolorbox}
\tcbuselibrary{breakable, skins}

\newtcolorbox{lmarginbox}{
  blanker, breakable, left=2.5em,
  borderline west={1pt}{0pt}{black}}

\begin{document}
\lipsum[33]

\begin{lmarginbox}
  \lipsum[1-2]
  \begin{lmarginbox}
    \lipsum[1-5]
  \end{lmarginbox}
  \lipsum[4-5]
\end{lmarginbox}

\lipsum[33]
\end{document}

-- 编辑 3 --

我还发现这个答案这似乎提供了一些使用 tikz 在多页之间画线的技巧。我想这可能是一个解决方案...

答案1

好的,我成功地得到了一个运行良好的第一个版本,包括memoir在奇数页和偶数页上放置不同的内容。

在此处输入图片描述

% https://tex.stackexchange.com/questions/532948/robustly-add-a-border-to-the-left-of-a-text-spanning-several-pages
\documentclass[a4paper,12pt]{memoir}
\usepackage{amsmath}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc,tikzmark}
\usepackage{lipsum}
%\usepackage{showframe}
\usepackage{everypage}
\usepackage{changepage}
\usepackage{environ}

\def\subproofsDefaultShift{7mm}

\tikzset{
  /subproofs/defaultStyle/.style={
    black!30!white,
    line width=1pt,
    transform canvas={xshift=-\subproofsDefaultShift/2+.5pt},
  }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Deal with drawings and marking.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Warning: tikz does not like ExplSyntax since it removes spaces
\def\addTikzmarkAndPagesInfo#1{%
  \tikzmark{beginTikzmark#1}%
  \tikz[remember picture, overlay] \coordinate (pageInfoNWOf#1) at (current page text area.north west);%
  \tikz[remember picture, overlay] \coordinate (pageInfoSEOf#1) at (current page text area.south east);%
}


\def\drawLinesOfTikzmarkSamePage#1{%
  \tikz[remember picture, overlay]%
  \draw[/subproofs/defaultStyle] (pic cs:beginTikzmark#1) to ({pic cs:endTikzmark#1}-|{pic cs:beginTikzmark#1});%
}

\def\drawLinesOfTikzmarkStart#1{%
  \tikz[remember picture, overlay]%
  \draw[/subproofs/defaultStyle] (pic cs:beginTikzmark#1) to ({pic cs:beginTikzmark#1}|-{current page text area.south west});%
}

\def\drawLinesOfTikzmarkMiddle#1{%
  \tikz[remember picture,overlay] \draw[/subproofs/defaultStyle] %
  let%
    \p1=(pic cs:beginTikzmark#1),%
    \p2=(pageInfoNWOf#1),%
    \p3=(current page text area.north west),%
    \p4=(current page text area.south east) in%
    (\x1-\x2+\x3,\y3) to (\x1-\x2+\x3,\y4);%
}

\def\drawLinesOfTikzmarkEnd#1{%
  \tikz[remember picture,overlay] \draw[/subproofs/defaultStyle] %
  let%
    \p1=(pic cs:beginTikzmark#1),%
    \p2=(pageInfoNWOf#1),%
    \p3=(current page text area.north west),%
    \p4=(current page text area.south east),%
    \p5=(pic cs:endTikzmark#1) in %
    (\x1-\x2+\x3,\y3) to (\x1-\x2+\x3,\y5);%
}

\makeatletter
% \checkmarkpage{label}{if before}{if same page}{if after}
% Apply different codes if we are on a page before, the current page,
\newcommand{\checkmarkpage}[4]% #1 = tikzmark label, #2 = less, #3 = equal, #4 = greater
{\@ifundefined{save@pt@#1}{#2}{%
  \edef\markid{\csname save@pt@#1\endcsname}%
  \edef\markpage{\csname save@pg@\markid\endcsname}%
  \ifnum\thepage<\markpage\relax #2%
  \else
    \ifnum\thepage=\markpage\relax #3%
    \else #4%
    \fi
  \fi}%
}
\makeatother

%%% Starts expl3 syntax https://mirrors.concertpass.com/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf
%%% For the list of modules and everything http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf
%%% (this also provides a quickstart at the beginning)
%%% For functions https://tex.stackexchange.com/questions/492794/how-to-define-two-expl3-functions-with-the-same-base-name-and-different-signatur
%%% This code is certainly not an example of LaTeX programming as it's the first time I use expl3...
\ExplSyntaxOn

% l=local, name, type. Note that this is only convention, it could be named "\foo" instead.
% clist are list separated by commas.
% To remove stuff https://tex.stackexchange.com/questions/5754/delete-an-element-from-a-comma-delimited-list
\seq_new:N\l_ListOfLinesToDraw_seq{}

\newcounter{nextMarkId}

% Inspired by https://tex.stackexchange.com/questions/528774/excess-vertical-space-in-vdots/528775#528775
% See also https://tex.stackexchange.com/questions/622881/align-element-tikzmark-with-top-of-the-current-line-instead-of-baseline/622936#622936
% TODO: Read also https://fr.overleaf.com/learn/latex/Articles/Boxes_and_Glue%3A_A_Brief%2C_but_Visual%2C_Introduction_Using_LuaTeX

\newlength{\oldbaselineskip}
\newlength{\oldlineskip}
\newlength{\oldlineskiplimit}

\long\def\addZeroWidthLine#1{%
  \oldbaselineskip=\baselineskip%
  \oldlineskip=\lineskip%
  \oldlineskiplimit=\lineskiplimit%
  \baselineskip=0pt%
  \lineskip=0pt%
  \lineskiplimit=0pt%
  \noindent#1\par%
  \baselineskip=\oldbaselineskip%
  \lineskip=\oldlineskip%
  \lineskiplimit=\oldlineskiplimit%
}


\NewEnviron{subproof}{%
  \edef\thisMarkId{\thenextMarkId}% Temporary variable to use at the end.
  \seq_gput_right:NV \l_ListOfLinesToDraw_seq \thisMarkId % Add it to the list
  \begin{adjustwidth}{\subproofsDefaultShift}{0cm}%
    \dealWithOneLine:V{\thisMarkId}% Draw the line for the current one. TODO
    \addZeroWidthLine{\addTikzmarkAndPagesInfo{\thenextMarkId}}%
    \stepcounter{nextMarkId}%
    % Ensures a group is inserted around the BODY
    { \noindent \BODY \par }%
    \addZeroWidthLine{\tikzmark{endTikzmark\thisMarkId}}%
  \end{adjustwidth}%
}%

%% Create a new function (see http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf page 14)

\cs_new:Nn \dealWithOneLine:n{
  \checkmarkpage{beginTikzmark#1}{%
    %%%%%%%%%% We have not yet seen the beginTikzMark... Don't care.
  }{ %%%%%%%%%% We are on the page of the start.
    \checkmarkpage{endTikzmark#1}%
    {%%%%%%%%%% The end is later
      \drawLinesOfTikzmarkStart{#1}%
    }%
    {%%%%%%%%%% The end is on the same page
      \drawLinesOfTikzmarkSamePage{#1}%
    }{% The end was on a previous page... impossible
    }%
  }{ %%%%%%%%%% The start point is on a previous page
    \checkmarkpage{endTikzmark#1}%
    {%%%%%%%%%% The end is later
      \drawLinesOfTikzmarkMiddle{#1}%
    }%
    {%%%%%%%%%% The end is on the same page
      \drawLinesOfTikzmarkEnd{#1}%
    }{%%%%%%%%%% The end has already been seen... I don't care
    }%
  }%
}

% defines \dealWithOneLine:V that expands its argument
\cs_generate_variant:Nn \dealWithOneLine:n { V }

%% Create a new function (see http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf page 14)
\cs_new:Nn \dealWithAllLines:N {
  \seq_map_inline:Nn \l_ListOfLinesToDraw_seq {
    \dealWithOneLine:n{##1}
  }
}

\AddEverypageHook{\dealWithAllLines:N{}}

\ExplSyntaxOff

\begin{document}

\newpage

\thispagestyle{empty}

\lipsum[1]

\begin{subproof}%
  We prove now that $1+1+1 = 3$. First we will prove that $1+1+1=3$:
  \begin{subproof}%
    In order to prove that $1+1+1=3$, we first prove that $1+1=2$.
    \begin{subproof}%
      By definition $2 = 1+1$.
    \end{subproof}%
    But we can show that $1+1+1=2+1$.
    \begin{subproof}%
      Indeed, by associativity of the addition, we know that
      \begin{align}
        1+1+1=(1+1)+1\label{eq:abc}
      \end{align}
      But we saw above that $1+1=2$ so $1+1+1=2+1$
    \end{subproof}%
    It is now possible to see that $1+1+1=3$
    \begin{subproof}%
      We can use now Eq.~\ref{eq:abc} and the definition of $3$:
      \[1+1+1=2+1=3\]
    \end{subproof}%
    As you can see, there is an ugly space just above.
    \begin{subproof}
      Also the line adapts to height and depth \rule[-1cm]{2cm}{3cm}.
    \end{subproof}%
    This error is also present at the end of this subproof. \lipsum[1-3]
  \end{subproof}%
\end{subproof}

\end{document}

更新

这是一个版本,我还提供了两个环境linedproof,并prooftcolorbox在整个证明的左边添加了一行(每个版本将该行放在不同的位置)。

linedproof在此处输入图片描述

prooftcolorbox

在此处输入图片描述

请注意,prooftcolorbox 基于 tcolorbox(这不是问题,因为我不嵌套它们,因为subproofs它不基于 tcolorbox)。然而,这意味着整个证明的边框没有使用 tikz 样式……这有点令人难过。我尝试编写自己的没有 tcolorbox 的证明,但我遇到了间距问题。

% https://tex.stackexchange.com/questions/532948/robustly-add-a-border-to-the-left-of-a-text-spanning-several-pages
\documentclass[a4paper,12pt]{memoir}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc,tikzmark}
\usepackage{lipsum}
%\usepackage{showframe}
\usepackage{everypage}
\usepackage{changepage}
\usepackage{environ}
% \directlua{ require("drawboxes")}
% \usepackage{graphicx,atbegshi}
\usepackage[many]{tcolorbox}
\usepackage{xpatch}


%\AtBeginShipout {\directlua{drawboxes.visual_debug()}}

\def\subproofsDefaultShift{5mm}
% Shift towards the center of the line
\def\subproofsDefaultFirstPointYShift{.3em} %% Better results when using baselineskip
%\def\subproofsDefaultFirstPointYShift{0em} %% Better results when using `\hrule height0pt`
\def\subproofsDefaultSecondPointYShift{0em}
\definecolor{dark-gray}{gray}{0.70}
\def\colorFrame{dark-gray}

\tikzset{
  /subproofs/defaultStyle/.style={
    \colorFrame,%black!30!white,
    line width=.4pt,
    transform canvas={xshift=-\subproofsDefaultShift/2},
  }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Deal with drawings and marking.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Warning: tikz does not like ExplSyntax since it removes spaces
\def\addTikzmarkAndPagesInfo#1{%
  \tikzmark{beginTikzmark#1}%
  \tikz[remember picture, overlay] \coordinate (pageInfoNWOf#1) at (current page text area.north west);%
  \tikz[remember picture, overlay] \coordinate (pageInfoSEOf#1) at (current page text area.south east);%
}


\def\drawLinesOfTikzmarkSamePage#1{%
  \tikz[remember picture, overlay]%
  \draw[/subproofs/defaultStyle] ([yshift=-\subproofsDefaultFirstPointYShift]pic cs:beginTikzmark#1) to ([yshift=\subproofsDefaultSecondPointYShift]{{pic cs:endTikzmark#1}-|{pic cs:beginTikzmark#1}});%
}

\def\drawLinesOfTikzmarkStart#1{%
  \tikz[remember picture, overlay]%
  \draw[/subproofs/defaultStyle] ([yshift=-\subproofsDefaultFirstPointYShift]pic cs:beginTikzmark#1) to ({pic cs:beginTikzmark#1}|-{current page text area.south west});%
}

\def\drawLinesOfTikzmarkMiddle#1{%
  \tikz[remember picture,overlay] \draw[/subproofs/defaultStyle] %
  let%
    \p1=(pic cs:beginTikzmark#1),%
    \p2=(pageInfoNWOf#1),%
    \p3=(current page text area.north west),%
    \p4=(current page text area.south east) in%
    (\x1-\x2+\x3,\y3) to (\x1-\x2+\x3,\y4);%
}

\def\drawLinesOfTikzmarkEnd#1{%
  \tikz[remember picture,overlay] \draw[/subproofs/defaultStyle] %
  let%
    \p1=(pic cs:beginTikzmark#1),%
    \p2=(pageInfoNWOf#1),%
    \p3=(current page text area.north west),%
    \p4=(current page text area.south east),%
    \p5=([yshift=\subproofsDefaultSecondPointYShift]pic cs:endTikzmark#1) in %
    (\x1-\x2+\x3,\y3) to (\x1-\x2+\x3,\y5);%
}

\makeatletter
% \checkmarkpage{label}{if before}{if same page}{if after}
% Apply different codes if we are on a page before, the current page,
\newcommand{\checkmarkpage}[4]% #1 = tikzmark label, #2 = less, #3 = equal, #4 = greater
{\@ifundefined{save@pt@#1}{#2}{%
  \edef\markid{\csname save@pt@#1\endcsname}%
  \edef\markpage{\csname save@pg@\markid\endcsname}%
  \ifnum\thepage<\markpage\relax #2%
  \else
    \ifnum\thepage=\markpage\relax #3%
    \else #4%
    \fi
  \fi}%
}
\makeatother

%%% Starts expl3 syntax https://mirrors.concertpass.com/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf
%%% For the list of modules and everything http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf
%%% (this also provides a quickstart at the beginning)
%%% For functions https://tex.stackexchange.com/questions/492794/how-to-define-two-expl3-functions-with-the-same-base-name-and-different-signatur
%%% This code is certainly not an example of LaTeX programming as it's the first time I use expl3...
\ExplSyntaxOn

% l=local, name, type. Note that this is only convention, it could be named "\foo" instead.
% clist are list separated by commas.
% To remove stuff https://tex.stackexchange.com/questions/5754/delete-an-element-from-a-comma-delimited-list
\seq_new:N\l_ListOfLinesToDraw_seq{}

\newcounter{nextMarkId}

% Inspired by https://tex.stackexchange.com/questions/528774/excess-vertical-space-in-vdots/528775#528775
% See also https://tex.stackexchange.com/questions/622881/align-element-tikzmark-with-top-of-the-current-line-instead-of-baseline/622936#622936
% TODO: Read also https://fr.overleaf.com/learn/latex/Articles/Boxes_and_Glue%3A_A_Brief%2C_but_Visual%2C_Introduction_Using_LuaTeX

\newlength{\oldbaselineskip}
\newlength{\oldlineskip}
\newlength{\oldlineskiplimit}

%%%% Uncomment to have the "baselinemode" (and comment next definition)
\long\def\addZeroWidthLine#1{%
  \oldbaselineskip=\baselineskip%
  \oldlineskip=\lineskip%
  \oldlineskiplimit=\lineskiplimit%
  \baselineskip=0pt%
  \lineskip=0pt%
  \lineskiplimit=0pt%
  \noindent#1\par\nobreak%
  \baselineskip=\oldbaselineskip%
  \lineskip=\oldlineskip%
  \lineskiplimit=\oldlineskiplimit%
}

%%%% Uncomment to have the "hrule" version:
% \long\def\addZeroWidthLine#1{%
%   \vskip\lineskip\hrule height0pt\noindent#1\hrule height0pt\vskip\lineskip%
% }


\NewEnviron{subproof}{%
  \edef\thisMarkId{\thenextMarkId}% Temporary variable to use at the end.
  \seq_gput_right:NV \l_ListOfLinesToDraw_seq \thisMarkId % Add it to the list
  \begin{adjustwidth}{\subproofsDefaultShift}{0cm}%
    \dealWithOneLine:V{\thisMarkId}% Draw the line for the current one.
    \addZeroWidthLine{\addTikzmarkAndPagesInfo{\thenextMarkId}}%
    \stepcounter{nextMarkId}%
    % Ensures a group is inserted around the BODY
    { \noindent \BODY \par\nobreak}% nobreak is used to ensure the tikzmark is not pushed on a new page.
    \addZeroWidthLine{\tikzmark{endTikzmark\thisMarkId}}\nopagebreak%
  \end{adjustwidth}%
}%

\NewEnviron{linedproof}{%
  \edef\thisMarkId{\thenextMarkId}% Temporary variable to use at the end.
  \seq_gput_right:NV \l_ListOfLinesToDraw_seq \thisMarkId % Add it to the list
  \begin{proof}\phantom{x}% Not sure why, using ~ does not work.
    \begin{adjustwidth}{\subproofsDefaultShift}{0cm}%
      \dealWithOneLine:V{\thisMarkId}% Draw the line for the current one.
      \addZeroWidthLine{\addTikzmarkAndPagesInfo{\thenextMarkId}}%
      \stepcounter{nextMarkId}%
      % Ensures a group is inserted around the BODY
      { \noindent \BODY }% nobreak is used to ensure the tikzmark is not pushed on a new page.
      % \hrule height0pt also "fake" a zero-width line.
    \qedhere\hrule height0pt\tikzmark{endTikzmark\thisMarkId}\end{adjustwidth}%%
  \end{proof}
}%

% \NewEnviron{wholelinedproof}{%
%   A\addZeroWidthLine{\addTikzmarkAndPagesInfo{\thenextMarkId}}B%
%   %\vskip\lineskip\noindent \hrule height0pt\addTikzmarkAndPagesInfo{\thenextMarkId}\hrule height0pt%
%   \edef\thisMarkId{\thenextMarkId}% Temporary variable to use at the end.
%   \seq_gput_right:NV \l_ListOfLinesToDraw_seq \thisMarkId % Add it to the list
%   \dealWithOneLine:V{\thisMarkId}% Draw the line for the current one.
%   \begin{proof}%
%       \stepcounter{nextMarkId}%
%       % Ensures a group is inserted around the BODY
%       { \noindent \BODY }% nobreak is used to ensure the tikzmark is not pushed on a new page.
%       % \hrule height0pt also "fake" a zero-width line.
%     \qedhere\hrule height0pt\tikzmark{endTikzmark\thisMarkId}%%
%   \end{proof}
% }%

% \NewEnviron{wholelinedproof}{%
%   \addTikzmarkAndPagesInfo{\thenextMarkId}%
%   %\vskip\lineskip\noindent \hrule height0pt\addTikzmarkAndPagesInfo{\thenextMarkId}\hrule height0pt%
%   \edef\thisMarkId{\thenextMarkId}% Temporary variable to use at the end.
%   \seq_gput_right:NV \l_ListOfLinesToDraw_seq \thisMarkId % Add it to the list
%   \dealWithOneLine:V{\thisMarkId}% Draw the line for the current one.
%   \begin{proof}%
%       \stepcounter{nextMarkId}%
%       % Ensures a group is inserted around the BODY
%       { \noindent \BODY }% nobreak is used to ensure the tikzmark is not pushed on a new page.
%       % \hrule height0pt also "fake" a zero-width line.
%     \qedhere\hrule height0pt\tikzmark{endTikzmark\thisMarkId}%%
%   \end{proof}
% }%

\ExplSyntaxOff %tcolorbox does not like explsyntax

% https://tex.stackexchange.com/questions/169794/outer-margin-of-tcolorbox
\newenvironment{prooftcolorbox}{\begin{proof}}{\end{proof}}
\tcolorboxenvironment{prooftcolorbox}{
  blanker,
  before skip=\topsep,
  after skip=\topsep,
  borderline west={0.4pt}{0.4pt}{\colorFrame},
  breakable,
  left=\subproofsDefaultShift/2,
  grow to left by=\subproofsDefaultShift/2,
%  colframe=,
%  right=12pt, % I'd avoid this
}

\ExplSyntaxOn
%% Create a new function (see http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf page 14)

\cs_new:Nn \dealWithOneLine:n{
  \checkmarkpage{beginTikzmark#1}{%
    %%%%%%%%%% We have not yet seen the beginTikzMark... Don't care.
  }{ %%%%%%%%%% We are on the page of the start.
    \checkmarkpage{endTikzmark#1}%
    {%%%%%%%%%% The end is later
      \drawLinesOfTikzmarkStart{#1}%
      %\printList:N{} Size is \seq_count:N \l_ListOfLinesToDraw_seq%
    }%
    {%%%%%%%%%% The end is on the same page
      \drawLinesOfTikzmarkSamePage{#1}%
      %% We can remove the item from the list so that we don't process it anymore.
      \seq_gremove_all:Nn \l_ListOfLinesToDraw_seq {#1}%
      %\printList:N{} Size is \seq_count:N \l_ListOfLinesToDraw_seq%
    }{% The end was on a previous page... impossible
    }%
  }{ %%%%%%%%%% The start point is on a previous page
    \checkmarkpage{endTikzmark#1}%
    {%%%%%%%%%% The end is later
      \drawLinesOfTikzmarkMiddle{#1}%
      %\printList:N{} Size is \seq_count:N \l_ListOfLinesToDraw_seq%
    }%
    {%%%%%%%%%% The end is on the same page
      \drawLinesOfTikzmarkEnd{#1}%
      %% We can remove the item from the list so that we don't process it anymore.
      \seq_gremove_all:Nn \l_ListOfLinesToDraw_seq {#1}%
      %\printList:N{} Size is \seq_count:N \l_ListOfLinesToDraw_seq%
    }{%%%%%%%%%% The end has already been seen... I don't care
    }%
  }%
}

% defines \dealWithOneLine:V that expands its argument
\cs_generate_variant:Nn \dealWithOneLine:n { V }

%% Create a new function (see http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf page 14)
\cs_new:Nn \dealWithAllLines:N {
  \seq_map_inline:Nn \l_ListOfLinesToDraw_seq {
    \dealWithOneLine:n{##1}
  }
}
%% Create a new function (see http://linorg.usp.br/CTAN/macros/latex/contrib/l3kernel/interface3.pdf page 14)
\cs_new:Nn \printList:N {
  [
  \seq_map_inline:Nn \l_ListOfLinesToDraw_seq {
    ##1,
  }
  ]
}

\AddEverypageHook{\dealWithAllLines:N{}}

\ExplSyntaxOff

\begin{document}

\newpage

\thispagestyle{empty}


% \begin{subproof}
%   ABC
% \end{subproof}

\begin{linedproof}~% Use '~' to ensure  the subproof starts on a new line.
  % See also https://tex.stackexchange.com/questions/122954/starting-a-proof-with-paragraph
  %  \begin{subproof}%
    We prove now that $1+1+1 = 3$. First we will prove that $1+1+1=3$:
    \begin{subproof}%
      In order to prove that $1+1+1=3$, we first prove that $1+1=2$.
      \begin{subproof}%
        By definition $2 = 1+1$.
      \end{subproof}%
      But we can show that $1+1+1=2+1$.
      \begin{subproof}%
        Indeed, by associativity of the addition, we know that
        \begin{align}
          1+1+1=(1+1)+1\label{eq:abc}
        \end{align}
        But we saw above that $1+1=2$ so $1+1+1=2+1$
      \end{subproof}%
      It is now possible to see that $1+1+1=3$
      \begin{subproof}%
        We can use now Eq.~\ref{eq:abc} and the definition of $3$:
        \[1+1+1=2+1=3\]
      \end{subproof}%
      As you can see, the spacing issues are now solved. See \texttt{\subproofsDefaultFirstPointYShift} to move more or less the first point on the y axis (to ensure it's not too close to the above line). It defaults to \texttt{0.3em}.
      \begin{subproof}
        Also the line adapts to height and depth \rule[-1cm]{2cm}{3cm}.
      \end{subproof}%
      \lipsum[1-5]
      Bla bla bla bla blaBla bla bla bla blaBla bla bla bla blaBla bla bla bla blaBla bla bla bla blaBla bla bla biblobi blabla blabla Bla bla bla bla blaBla bla bla bla blaBla bla bla% If this is the last thing, use \qedhere so that the qed is on the same line as this text.
    \end{subproof}%
  Which concludes the proof. Which concludes the proofWhich concludes the proofWhich concludes the proofWhich the proof. Which concludes the proof. Which concludes the proofWhich concludes the proof.
\end{linedproof}

Hello

\begin{subproof}
  Coucou
\end{subproof}

\newpage

\lipsum[1]
\begin{prooftcolorbox} We prove now that $1+1+1 = 3$. First we will prove that the equation $1+1+1=3$ is true:
    \begin{subproof}%
      In order to prove that $1+1+1=3$, we first prove that $1+1=2$.
      \begin{subproof}%
        By definition $2 = 1+1$.
      \end{subproof}%
      But we can show that $1+1+1=2+1$.
      \begin{subproof}%
        Indeed, by associativity of the addition, we know that
        \begin{align}
          1+1+1=(1+1)+1\label{eq:abc}
        \end{align}
        But we saw above that $1+1=2$ so $1+1+1=2+1$
      \end{subproof}%
      It is now possible to see that $1+1+1=3$
      \begin{subproof}%
        We can use now Eq.~\ref{eq:abc} and the definition of $3$:
        \[1+1+1=2+1=3\]
      \end{subproof}%
      As you can see, the spacing issues are now solved. See \texttt{\subproofsDefaultFirstPointYShift} to move more or less the first point on the y axis (to ensure it's not too close to the above line). It defaults to \texttt{0.3em}.
      \begin{subproof}
        Also the line adapts to height and depth \rule[-1cm]{2cm}{3cm}.
      \end{subproof}%
      \lipsum[1-5]
      Bla bla bla bla blaBla bla bla bla blaBla bla bla bla blaBla bla bla bla blaBla bla bla bla blaBla bla bla biblobi blabla blabla Bla bla bla bla blaBla bla bla bla blaBla bla bla\qedhere
    \end{subproof}%
\end{prooftcolorbox}

\newpage

Check alignement of tcolorbox proof:

Normal proofs
\begin{proof} Here is my proof.
\end{proof}

\begin{proof} Here is my proof.
\end{proof}

\begin{proof} Here is my proof.
\end{proof}

Tcolorbox proof
\begin{prooftcolorbox} Here is my proof.
\end{prooftcolorbox}

\begin{prooftcolorbox} Here is my proof.
\end{prooftcolorbox}

\begin{prooftcolorbox} Here is my proof.
\end{prooftcolorbox}



Normal proofs
\begin{proof}~

  Here is my proof.
\end{proof}

\begin{proof}~

  Here is my proof.
\end{proof}

\begin{proof}~

  Here is my proof.
\end{proof}

Lined proofs
\begin{linedproof} Here is my proof.
\end{linedproof}

\begin{linedproof} Here is my proof.
\end{linedproof}

\begin{linedproof} Here is my proof.
\end{linedproof}

\end{document}

编辑 有关的:删除证明环境前后的空格

编辑 我设法得到了一个处理脚注的版本。参见这里

答案2

一次tcolorbox尝试

\documentclass{article}
\usepackage{lipsum}
\usepackage{tcolorbox}
\tcbuselibrary{breakable, skins}

\newtcolorbox{lmarginbox}{
  blanker, breakable, left=2.5em,
  borderline west={1pt}{0pt}{black}}

\begin{document}
\lipsum[33]

\begin{lmarginbox}
  \lipsum[1-2]
  \begin{lmarginbox}
    \lipsum[3]
  \end{lmarginbox}
  \lipsum[4-5]
\end{lmarginbox}

\lipsum[33]
\end{document}

注意到您使用了环境名称subproof。如果您想重新定义类似定理的环境,请参见tcolorbox的文档,第 17.4 节。

答案3

我不认为这是一个好主意,但它是可能的tcolorbox

姆韦

\documentclass[a5paper]{article}
\usepackage{lipsum}
\usepackage[most]{tcolorbox}
\newtcolorbox{badbox}{blanker, enforce breakable, left=2em,
  borderline west={1pt}{0pt}{black}}
\begin{document}
\begin{badbox}
\lipsum[1][1-8]
\begin{badbox}
\lipsum[1][1-8]
\begin{badbox}
\lipsum[1][1-8]
\begin{badbox}
\lipsum[1][1-1]
\begin{badbox}
\lipsum[1][1-2]
\begin{badbox}
\lipsum[1][1-3]
\end{badbox}
\end{badbox}
\end{badbox}
\end{badbox}
\end{badbox}
\end{badbox}
\end{document}

相关内容