Как лучше всего нарисовать произвольное количество линий в LaTeX?

Как лучше всего нарисовать произвольное количество линий в LaTeX?

Я хочу создать несколько разделов, за каждым из которых следует несколько строк i. Вот как я это сделал, используя multido, чтобы повторить пользовательскую команду \drawline i раз.

\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}

Что производит это:

введите описание изображения здесь

Проблема, с которой я столкнулся, похоже, связана с линией разрыва, \\следующей за определением tikzpicture. Мне нужно разбить строки между вызовами \drawline, чтобы строки отображались последовательно, а не рядом друг с другом. Однако у меня есть две проблемы:

  1. После последнего вызова \drawline я получаю лишнюю ненужную пустую строку, то есть дополнительный пробел между разделами.
  2. Когда строки одного раздела заполняют страницу более или менее идеально, следующий раздел появляется на следующей странице, но не в верхней части страницы. Между верхней частью страницы и заголовком раздела есть пробел.

Согласно документации, синтаксис multido следующий:

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

Есть ли способ сделать ссылку?повторениякак переменная? Например, если бы кто-то хотел, чтобы перенос строки применялся для всех n, где n <повторения? В этом случае условное предложение можно использовать для переноса строки во всех случаях, кроме последнего.

Или можно вместо этого использовать координаты в tikzpicture относительно другого tikzpicture? Таким образом \drawline можно определить без обращения к \\в конце.

решение1

Не обязательно использовать multidowhen tikzis load. Просто используйте \foreach:

введите описание изображения здесь

\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}

решение2

Достаточно общий метод повторения чего-либо заданное количество раз, использующий также соответствующий индекс.

\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}

Первый аргумент — \REPEATэто количество повторений; второй аргумент — это код для выполнения, где мы можем ссылаться на индекс с помощью ##1.

В конкретном случае вам нужен \REPEATмакрос \drawline, который устанавливает текущий индекс в поле нулевой ширины, выступающее вправо, а затем рисует линию на всю ширину текста, на 2 пункта ниже базовой линии и толщиной 0,2 пункта.

введите описание изображения здесь

решение3

Нет необходимости использовать TiкZ для этого вы также можете использовать встроенные в LaTeX возможности \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}

введите описание изображения здесь

решение4

Версия LaTeX3 с использованием \rule(на основе ответа 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}

введите описание изображения здесь

Связанный контент