![具有变化的行号的垂直引线](https://linux22.com/image/475011/%E5%85%B7%E6%9C%89%E5%8F%98%E5%8C%96%E7%9A%84%E8%A1%8C%E5%8F%B7%E7%9A%84%E5%9E%82%E7%9B%B4%E5%BC%95%E7%BA%BF.png)
我目前正在使用一个命令(改编自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}
以下是示例的结果:
作为一个附加问题,如果有人可以让 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 ht
and 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}
}