페이지 끝까지 반복

페이지 끝까지 반복

한 페이지를 계속해서 반복되는 한 단어나 문구로 채우고 싶습니다. 그러면 이 페이지를 인쇄하겠습니다. 예를 들어,

\documentclass[12pt]{article}

\usepackage[margin=0.5in]{geometry}
\usepackage{pgffor}

\begin{document}
\thispagestyle{empty}
\pagestyle{empty}
\setlength{\parindent}{0cm}
\def\Phrase{Phrase to repeat }
\def\repititions{400}%The issue is with the number 400.

\foreach \n in {0,...,\repititions}{\Phrase}
\end{document}

400하지만 시행착오를 거쳐 그 숫자를 알아냈습니다 . 페이지를 인쇄할 것이므로 숫자를 \repetition임의로 크게 설정할 수 있으므로 이는 실제로 문제가 되지 않습니다. 오히려 그게 불만이에요.

그래서 내 질문은 다음과 같습니다.

400시행착오를 통해 값을 찾아내는 대신 페이지 끝에서 루프를 중지할 수 있는 방법이 있습니까 ?

답변1

페이지 빌더는 비동기식이며 TeX은 단락을 조판할 때 페이지가 끝나는 위치에 대한 어떠한 단서도 갖지 않습니다. 단락이 끝난 경우에만 페이지 나누기가 결정됩니다.

내 전략은 상자에 거대한 단락을 만든 다음 원하는 텍스트 높이와 비교하는 것입니다. 아직 그 아래에 있다면, 더 많은 반복을 거쳐 새로운 상자가 준비됩니다. 자료가 충분하면(페이지 높이에 세 줄을 더한 값) 상자가 원하는 높이로 분할되어 현재 페이지에 배치됩니다.

\documentclass[12pt]{article}

\usepackage[
  margin=0.5in,
  heightrounded, % whole number of lines on the page
  showframe,     % just for the example
]{geometry}
\usepackage{expl3}

\ExplSyntaxOn
% faster than \pgffor
\cs_set_eq:NN \repeatphrase \prg_replicate:nn
\ExplSyntaxOff

\pagestyle{empty}
\setlength{\parindent}{0cm}

\begin{document}

\def\Phrase{Phrase to repeat }
\count255=200 % or anything that seems fit
\loop
  \typeout{Trying \the\count255\space\space repetitions}
  \setbox0=\vbox{\repeatphrase{\count255}{\Phrase}}
  \ifdim\ht0<\dimexpr\textheight+3\baselineskip\relax
  \advance\count255 by 20
\repeat

\setbox0=\vbox to \textheight{
  \vbadness=10000 % remove a spurious message
  \vsplit0 to \textheight
}
\unvbox0

\end{document}

터미널과 로그 파일의 메시지는 다음과 같습니다.

Trying 200 repetitions
Trying 220 repetitions
Trying 240 repetitions
Trying 260 repetitions
Trying 280 repetitions
Trying 300 repetitions
Trying 320 repetitions

시작점은 필요한 것의 대략적인 추정치인 200입니다(1부터 시작할 수도 있지만 의미가 없어 보입니다).

여기에 이미지 설명을 입력하세요

LaTeX에는 에 대한 공개 인터페이스가 없으므로 \vsplit낮은 수준의 프로그래밍에 의존해야 합니다.

expl3다음은 본질적으로 동일한 정식 버전입니다 . 페이지를 더 잘 채우기 위해 행간 건너뛰기에 약간의 유연성을 추가했습니다.

\documentclass[12pt]{article}

\usepackage[
  margin=0.5in,
  heightrounded, % whole number of lines on the page
  showframe,     % just for the example
]{geometry}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\fillpage}{O{200}m}
 {
  \clearpage
  \egreg_fillpage:nn { #1 } { #2 }
  \clearpage
 }

\int_new:N \l__egreg_fillpage_copies_int
\box_new:N \l__egreg_fillpage_box

\cs_new_protected:Npn \egreg_fillpage:nn #1 #2
 {
  \int_set:Nn \l__egreg_fillpage_copies_int { #1 }
  \bool_do_until:nn
   {
    \dim_compare_p:nNn { \box_ht:N \l__egreg_fillpage_box } > { \textheight + 3\baselineskip }
   }
   {
    \typeout{Trying~\int_eval:n { \l__egreg_fillpage_copies_int }~repetitions}
    \vbox_set:Nn \l__egreg_fillpage_box
     {
      \skip_set:Nn \baselineskip { 1\baselineskip plus 0.1pt }
      \prg_replicate:nn { \l__egreg_fillpage_copies_int } { #2 }
     }
    \int_add:Nn \l__egreg_fillpage_copies_int { 20 }
   }
  \vbox_set_split_to_ht:NNn \l__egreg_fillpage_box \l__egreg_fillpage_box { \textheight }
  \box_use_drop:N \l__egreg_fillpage_box
 }
\ExplSyntaxOff

\pagestyle{empty}
\setlength{\parindent}{0cm}

\begin{document}

\fillpage{Phrase to repeat }

\end{document}

이 명령에는 \fillpage초기 반복 횟수(기본값 200)를 설정하기 위한 선택적 인수가 있으므로

\fillpage[300]{Phrase to repeat }

300부터 시작하겠습니다.

답변2

내 솔루션은 임시 box0에 반복되는 텍스트를 한 번만 인쇄합니다. 그러면 이 box0은 \vsplit현재 페이지입니다.

매크로 \toendpage{repeated text}가 제공됩니다. 이 매크로는 현재 지점(페이지의 시작 부분이든 페이지 중간이든 관계 없음)부터 페이지 끝까지 현재 페이지를 채웁니다.

매크로는 \toendpage필요한 텍스트 반복 횟수를 계산해야 합니다. 이 숫자는 충분히 커야 하므로 다음과 같이 계산됩니다.

(1.3 * \hsize/ width_of_the_text + 1) *lines_in_the_\pagegoal

매크로는 다음과 같습니다:

\newcount\tmpnum
\def\toendpage#1{\par \bgroup
   \setbox0=\hbox{#1}
   \null \nobreak \vskip-\baselineskip % we need to set \pagegoal and set zero \prevdepth
   \dimen0=\pagegoal
   \divide\dimen0 by\baselineskip
   \tmpnum=\dimen0                % \tmpnum= number of lines in \pagegoal
   \dimen0=1.3\hsize   
   \divide\dimen0 by\wd0          % \dimen0= number of text in 1.3\hsize     
   \advance\dimen0 by1sp          % increased by one
   \multiply\dimen0 by\tmpnum     % \dimen0= number of repeats of the text
   \tmpnum=0
   \setbox0=\vbox{\null \loop #1\advance\tmpnum by1 \ifnum\tmpnum<\dimen0 \repeat}
   \vbadness=10000
   \dimen0=\pagegoal \advance\dimen0 by-\pagetotal
   \setbox0=\vsplit0 to\dimen0    % \vsplit to the end of the current page
   \unvbox0
   \vfil\break \egroup
}

Usage:        
\toendpage{This is repeated text. }

관련 정보