具有变化的行号的垂直引线

具有变化的行号的垂直引线

我目前正在使用一个命令(改编自https://tex.stackexchange.com/a/241139) 使水平线在我的考试中重复,并且我无法在每条线上添加递增数字。我添加了一个计数器,但我猜领导者只会评估该行一次,然后简单地重复它,因此计数器递增永远不会完成。

有没有办法修改命令,让数字真正增加,同时仍保持重复行直到页面结束的能力?这是当前代码,其中显示了所有用于间距的框架(命令用作\fillwithlines{\vfill})。我应该补充一点,任何产生完全相同结果的解决方案都是完全没问题的。具有相同用途的 Tikz 解决方案是可以接受的。

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{ulem}
\usepackage{showframe}
\usepackage{changepage}
\makeatletter
\newenvironment{restoretext}% Make sure that it takes the whole width
    {\@parboxrestore%
        \begin{adjustwidth}{}{\leftmargin}%
    }
    {\end{adjustwidth}%
    }
\makeatother

\newlength\gridskip
\setlength\gridskip{6mm plus 1mm minus 1mm}
\definecolor{mygray}{gray}{.8}
\newcounter{lignes}

\makeatletter
\def\fillwithlines#1{%
  \begin{restoretext}
    \setcounter{lignes}{1}
    {%
    \hrule height \z@
    \nobreak
    \unskip\nobreak\cleaders \hbox to \hsize{%
    \vrule height \gridskip depth \z@ width \z@
    \textcolor{mygray}{\uline{\hfill}\arabic{lignes}\addtocounter{lignes}{1}}} #1\relax
    }
  \end{restoretext}
}
\makeatother

\begin{document}

Find the derivative of $x^2$.
\fillwithlines{\vfill}

\end{document}

以下是示例的结果:

我们可以看到,行号没有增加,只是停留在 1。其余一切都很完美。

作为一个附加问题,如果有人可以让 gridskip 实际上在每个命令中使用独立的 glue 属性,以便完美地将线条放入页面中,那就太棒了:)

答案1

这对于问题的主要部分有效。这是非常非常多比用普通(无编号)规则或点填充的代码慢。我们不是复制包含规则或点线的单个框,而是逐步构建棺材。对于第一行,我们创建一个包含规则的基本棺材。然后我们在右侧附加一个数字。这实际上是在边距中。对于后续的每一行,我们首先测试页面上是否还有空间。如果有,我们会添加另外两个棺材:一个带有行的基本棺材的副本和一个带有下一个行号的新棺材。

\documentclass[a4paper]{article}
% ateb: https://tex.stackexchange.com/a/713911/
\usepackage{xcolor}
\usepackage[]{geometry}

\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% copied verbatim, excepting format from Joseph Wright's' siunitx.sty under LPPL
\@ifundefined{ExplLoaderFileDate}{%
  \RequirePackage{expl3}%
}{}
% almost verbatim from siunitx.sty
\@ifl@t@r\ExplLoaderFileDate{2022-02-24}{%
}{%
  \PackageError{fillwith}{Support package expl3 too old}
  {%
    You need to update your installation of the bundles 'l3kernel' and
    'l3packages'.\MessageBreak
    Loading~fillwith~will~abort!%
  }%
  \endinput
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\RequirePackage{svn-prov}
\ExplSyntaxOn

% BEGIN vars
\coffin_new:N \l__fillwith_line_coffin
\coffin_new:N \l__fillwith_lines_coffin
\coffin_new:N \l__fillwith_tmpa_coffin
\dim_new:N \l__fillwith_ht_dim
\dim_new:N \l__fillwith_rem_dim
\dim_new:N \l__fillwith_line_ht_dim
\dim_set:Nn \l__fillwith_line_ht_dim { 0.4pt }
\int_new:N \l__fillwith_cnt_int
% END vars
% BEGIN keys
\keys_define:nn { fillwith }
{
  fillwith~ht .tl_set:N = \l__fillwith_ht_tl,
  fillwith~ht .initial:n = 2,
  color .meta:n = {
    colour = #1,
  },
  colour .code:n = {
    \colorlet{fillwithcolour}{#1}
  },
  colour .initial:n = gray,
}
% END keys
% BEGIN fns
\cs_new_protected_nopar:Nn \fillwith_style: {}
\cs_new_protected_nopar:Nn \fillwith_coffin_tht:N 
{
  \dim_eval:n { \coffin_ht:N #1 + \coffin_dp:N #1 }
}
% BEGIN fillwith_nos:
\cs_new_protected:Nn \fillwith_nos: % rhybudd: ARAF ! SLOW!
{
  \color{fillwithcolour}
  \vcoffin_set:Nnn \l__fillwith_line_coffin { \linewidth } 
  {
    \vrule height \l__fillwith_line_ht_dim depth \c_zero_skip width \linewidth \fillwith_style:
  }
  \coffin_set_eq:NN \l__fillwith_lines_coffin \l__fillwith_line_coffin
  \int_incr:N \l__fillwith_cnt_int
  \vcoffin_set:Nnn \l__fillwith_tmpa_coffin  { 1.5em} {  \int_to_arabic:n { \l__fillwith_cnt_int } }
  \coffin_attach:NnnNnnnn \l__fillwith_lines_coffin {b} {r} \l__fillwith_tmpa_coffin {b} {l} {2.5pt} {0pt}
  \dim_set:Nn \l__fillwith_ht_dim { \fp_to_dim:n { \l__fillwith_ht_tl * \baselineskip }  }
  \dim_set:Nn \l__fillwith_rem_dim { \pagegoal -\footskip - \pagetotal - \l__fillwith_ht_dim  }
  \dim_until_do:nNnn { \fillwith_coffin_tht:N \l__fillwith_lines_coffin } > { \l__fillwith_rem_dim - \l__fillwith_ht_dim }
  {
    \coffin_join:NnnNnnnn \l__fillwith_lines_coffin { b } { l } \l__fillwith_line_coffin { t } { l } { 0pt } { -\l__fillwith_ht_dim }
    \int_incr:N \l__fillwith_cnt_int
    \vcoffin_set:Nnn \l__fillwith_tmpa_coffin  {1.5em} { \int_to_arabic:n { \l__fillwith_cnt_int } }
    \coffin_attach:NnnNnnnn \l__fillwith_lines_coffin {b} {r} \l__fillwith_tmpa_coffin {b} {l} {2.5pt} {0pt}  
  }
  \coffin_typeset:Nnnnn \l__fillwith_lines_coffin { t } { l } { 0pt } { -\l__fillwith_ht_dim }
  \normalcolor
}
% END \fillwith_nos:
% END fns
\NewDocumentCommand\fillwithset { +m }{
  \keys_set:nn { fillwith } { #1 }
}
% BEGIN \fillwithnolines
\NewDocumentCommand \fillwithnolines {  O { } }
{
  \group_begin:
    \keys_set:nn { fillwith } { #1 }
    \fillwith_nos:
  \group_end:
}
% END \fillwithnolines
\ExplSyntaxOff
\fillwithset{%
  colour=gray!80,
}
\begin{document}
\parindent=0pt

Find the derivative of $x^2$.

\fillwithnolines

\end{document} 

唯一可用的两个键是fillwith htand colour(或color)。第一个键决定线条扩展的因子(2默认情况下)。第二个键决定规则和数字的颜色(gray默认情况下)。

规则总是0.4pt高和\linewidth宽,但您可以轻松地配置这些尺寸,同时可以选择填充除剩余垂直空间之外的某些尺寸。

提前为糟糕的图像道歉。KDE/Okular 有一个新错误,它渲染位图图像时会变得杂乱无章。例如,PDF 是不是随机丢失规则!字母和数字也不会出现斑点和模糊!

无疑是模糊的输出

对于奖金,有三种可能性:我不确定我是否理解它;如果我理解了它,我不确定它是否可能;如果可能,我不知道如何实现。

答案2

这是用 Tikz 编写的函数,它的功能与我以前的函数相同。它还允许我计算要打印的内容(这对于更复杂的东西来说非常完美)。此外,我还添加了一个小测试,在需要时添加额外的行(当有 90% 或更多额外行的空间时)。

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{ulem}
\usepackage{showframe}
\usepackage{changepage}
\usepackage{tikz}

\usepackage{changepage}
\makeatletter
    \newenvironment{restoretext}
    {\@parboxrestore\begin{adjustwidth}{}{\leftmargin}}
    {\end{adjustwidth}}
\makeatother

\newlength\gridskip
\setlength\gridskip{7mm}
\definecolor{mygray}{gray}{.8}

\usetikzlibrary{calc}
\newdimen\topx
\newdimen\topy
\newdimen\bottomx
\newdimen\bottomy

\newcommand{\mylines}[1]{% #1: size of lines area
    \begin{restoretext} \par
    \tikz[remember picture, anchor=base]{\coordinate (topans);} #1
    \tikz[remember picture, anchor=base]{\coordinate (bottomans);}

    \begin{tikzpicture}[remember picture, overlay]
        % \draw (topans) -- (bottomans); % for debugging
        \pgfextractx{\topx}{\pgfpointanchor{topans}{center}}%
        \pgfextracty{\topy}{\pgfpointanchor{topans}{center}}%
        \pgfextractx{\bottomx}{\pgfpointanchor{bottomans}{center}}%
        \pgfextracty{\bottomy}{\pgfpointanchor{bottomans}{center}}%
        \pgfmathsetmacro\ansheight{veclen(\topx-\bottomx,\topy-\bottomy)*1pt}%
        \pgfmathsetmacro\numblines{floor(\ansheight / \gridskip)}; % Number of lines
        \pgfmathsetmacro\diff{frac(\ansheight / \gridskip)}
        \pgfmathsetmacro\start{0}
        \pgfmathsetmacro\endLoop{floor(\numblines)}
        \pgfmathparse{(\diff>0.9)?1:0}\ifdim\pgfmathresult pt>0pt
            \pgfmathsetmacro\endLoop{\endLoop+1};
        \fi
        \foreach \i in {\start,...,\endLoop} {
            \pgfmathsetmacro\pos{(\numblines-\i)+\diff}
            \pgfmathsetmacro\noline{int(\i + 1 - \start)};
            \draw [color=mygray] (0,\pos*\gridskip) -- (\linewidth,\pos*\gridskip) node [above left=-2pt, pos=-0.01] (a) {};
        }
    \end{tikzpicture}
    \end{restoretext}
}

相关内容