Qual é a melhor maneira de desenhar um número arbitrário de linhas em LaTeX?

Qual é a melhor maneira de desenhar um número arbitrário de linhas em LaTeX?

Desejo produzir uma série de seções, cada uma seguida por um número de linhas i. Foi assim que fiz usando multido para repetir um comando personalizado drawline i vezes.

\documentclass[12pt]{memoir}

\usepackage{tikz}
\usepackage{multido}

\newcommand{\drawline}{%
        \begin{tikzpicture}%
            \draw [gray] (0,0) -- (\textwidth, 0);%
            \node [above right] at (0,0) {\i.};
        \end{tikzpicture}%
        \\%
}


\begin{document}

\section*{Section 1}    
\multido{\i=1+1}{5}{\drawline}


\section*{Section 2}
\multido{\i=1+1}{4}{\drawline}
    
\end{document}

O que produz isso:

insira a descrição da imagem aqui

O problema que estou tendo parece estar relacionado à linha de interrupção \\que segue a definição do tikzpicture. Preciso quebrar linhas entre chamadas de \drawline para que as linhas apareçam em sequência e não uma ao lado da outra. No entanto, tenho dois problemas:

  1. Recebo uma linha vazia extra desnecessária após a última chamada de \drawline, significando espaço extra entre as seções.
  2. Quando as linhas de uma seção preenchem uma página mais ou menos perfeitamente, a próxima seção aparece na página seguinte, mas não no topo da página. Há um espaço em branco entre o topo da página e o título da seção.

A sintaxe para multido é esta de acordo com a documentação:

\multido{*variables*}{*repetitions*}{*stuff*}

Existe uma maneira de referênciarepetiçõescomo uma variável? Por exemplo, se alguém quiser que a quebra de linha se aplique a todos n onde n <repetições? Nesse caso, uma condicional poderia ser usada para quebrar a linha em todos os casos, exceto no último.

Ou é possível usar coordenadas no tikzpicture em relação a outro tikzpicture? Desta forma \drawline poderia ser definido sem recorrer ao \\final.

Responder1

Não é necessário usar multidoquando tikzestiver carregado. Apenas use \foreach:

insira a descrição da imagem aqui

\documentclass[12pt]{memoir}

\usepackage{tikz}

\newcommand{\linespace}{6mm}
\newcommand{\drawlines}[1]{\tikz{\foreach \n in {1,...,#1}
    {\draw[gray](0,-\n*\linespace)node[above right,black]{\n.}--(\textwidth,-\n*\linespace);}}}

\begin{document}

\section*{Section 1}    
\drawlines{5}

\section*{Section 2}
\drawlines{4}
    
\end{document}

Responder2

Um método bastante geral para repetir coisas um determinado número de vezes, usando também o índice correspondente.

\documentclass[12pt]{memoir}

\ExplSyntaxOn

\NewDocumentCommand{\REPEAT}{mm}
 {% #1 = number of lines to print, #2 = what to repeat
  \int_step_inline:nn { #1 } { #2 }
 }

\ExplSyntaxOff

\newcommand{\drawline}[1]{%
  \noindent\makebox[0pt][l]{#1.}%
  \leaders\hrule height -2pt depth 2.2pt \hfill
  \hspace*{0pt}\par
}
\newcommand{\drawlines}[1]{\REPEAT{#1}{\drawline{##1}}}

\begin{document}

\section{Title}

\drawlines{5}

\section{Title}

\drawlines{4}

\end{document}

O primeiro argumento \REPEATé o número de repetições; o segundo argumento é o código a ser executado, onde podemos nos referir ao índice por ##1.

No caso particular você deseja \REPEATa \drawlinemacro, que define o índice atual em uma caixa de largura zero saliente para a direita e então desenha uma regra com largura total do texto, 2pt abaixo da linha de base e com espessura de 0,2pt.

insira a descrição da imagem aqui

Responder3

Não é necessário usar TikZ para isso, você também pode usar o LaTeX integrado \rule:

\documentclass[12pt]{memoir}

\usepackage{xcolor}

\makeatletter
\newcommand\drawline[1]
  {\expandafter\drawline@\expandafter1\expandafter;\the\numexpr#1;}
\def\drawline@#1;#2;%
  {%
    \ifnum#1>#2
      \expandafter\@gobbletwo
    \fi
    \@firstofone
      {%
        \drawline@output{#1}%
        \expandafter\drawline@\the\numexpr#1+1;#2;%
      }%
  }
\newcommand\drawline@output[1]
  {%
    \par
    \noindent\rlap{#1.}%
    \textcolor{gray}{\rule[-0.3333em]{\linewidth}{.4pt}}%
    \par
  }
\makeatother


\begin{document}

\section*{Section 1}    
\drawline{5}

\section*{Section 2}
\drawline{4}
\end{document}

insira a descrição da imagem aqui

Responder4

Uma versão LaTeX3 usando \rule(com base na resposta de Skillmon)

\documentclass{article}
\usepackage{xcolor}

\ExplSyntaxOn
\int_new:N \g_dl_line_count
\NewDocumentCommand{\drawlines}{ m }{
    \int_set:Nn \g_dl_line_count {1}
    \prg_replicate:nn {#1} {%
        \par
        \noindent\rlap{\int_use:N \g_dl_line_count.}%
        \textcolor{gray}{\rule[-0.3333em]{\linewidth}{.4pt}}%
        \par
        \int_incr:N \g_dl_line_count
    }
}
\ExplSyntaxOff

\begin{document}
\section*{Section 1}    
\drawlines{5}

\section*{Section 2}
\drawlines{4}
\end{document}

insira a descrição da imagem aqui

informação relacionada