在段落的每一行文字周围放置一个方框

在段落的每一行文字周围放置一个方框

在我的环境中,我想自动在段落中的每一行文本周围创建一个框,以便我可以对每一行进行操作。我认为这应该在 LaTeX 中完成,而不是在纯 TeX 中完成,以免破坏文本着色和换行。我已经研究这个问题有一段时间了,但仍然不清楚如何安全地使用 LaTeX 完成此操作,因此任何帮助都将不胜感激。

这是用于排版萨法伊克语、萨比安语和一些古希腊书写系统中的牛耕式书写,以及 Rongorongo(复活节岛)中出现的反向牛耕式书写。对于牛耕式书写,我可以使用镜像法,\reflectbox因为这种书写方向就像牛在田里转圈一样。对于 Rongorongo,我可以使用镜像法\rotatebox[origin=c]{180}{,因为每隔一行旋转 180 度。

答案1

你是說這樣嗎? enter image description here

这只是一个开始,我把它放在一起,没有过多关注细节。特别是它假设每个段落只产生框和行间惩罚和粘合(各一个)。如果段落包含任何 vadjust 材料(\vspace或插入(begin{figure}或花哨的特殊内容(任何随机包:-)那么你注定要失败,或者至少需要更加努力。此外,它重新插入了之前存在的行间粘合,但如果你翻转了文本,这可能会在视觉上出现错误,因此最好丢弃它并让 TeX 再次找到自己的行间粘合。

但无论如何,希望这能帮助你入门:

这在开始时更加注重行间和段落间的间距。

\documentclass{article}

\usepackage{graphicx}

\setlength\textheight{20\baselineskip}
\raggedbottom


\def\a{One two three. }
\def\b{Red, Green, Blue. }
\def\c{\a\a\b\b\a\a\a\b\b\b\a\a\b\a\b\a\b}

\makeatletter

\def\hmmx{%
 \@tempcnta\z@
 \loop
  \advance\@tempcnta\@ne
  \setbox\z@\lastbox
  \global\dimen@i\ht\z@
  \skip@\lastskip\unskip
  \count@\lastpenalty\unpenalty
 \ifdim 5sp=\wd\z@
 \else
  \global\setbox\@ne\vbox{%
  \penalty\count@
  \vskip\skip@
  \ifodd\@tempcnta
   \hbox{\reflectbox{\box\z@}}%
  \else
   \box\z@
  \fi
  \unvbox\@ne}%
 \repeat}%


\def\hmm#1{%
 \dimen@\prevdepth
 \setbox0\vbox{%
 \hbox{\vrule\@height\z@\@width5sp\@depth\dimen@}\par
 #1\par
 \hmmx}%
 \unvbox\@ne}

\makeatother

\begin{document}

text with descender: g

\hmm{\c}

\hmm{\a\c\b\c}

\end{document}

答案2

下面是另一种替代方法,采用名为的宏的形式\boustrophedon

\documentclass{article}
\usepackage{lipsum}
\usepackage{graphicx}
\parindent0pt
\begin{document}
\newcounter{cnt}
\long\def\boustrophedon#1{%
 \setbox1=\vbox{\advance\hsize by -20pt#1}%place contents in a box
   \vfuzz=10pt % supress overull warnings 
   \splittopskip=0pt %no glue at top - normal TeX 10pt
    \def\rebox{%
      \hbox to 20pt{\strut\thecnt}%
      \nobreak
      \setbox2=\vsplit 1 to 6pt
      \vbox{\unvbox2\unskip}%
      \hskip 0pt plus 0pt\relax}%end rebox
     \loop
       \stepcounter{cnt}
       \ifodd\thecnt\reflectbox{\rebox}
       \else
         \rebox
       \fi
        % row
       \ifdim \ht1>0pt % test for more rows
    \repeat % if lines exist repeat
}

\boustrophedon{\lipsum[1]}
\boustrophedon{NI$\Psi$ON ANOMHMATA MH MONAN O$\Psi$IN\\ NI$\Psi$ON ANOMHMATA MH MONAN O$\Psi$IN} 
\end{document}

enter image description here

答案3

以下是使用@GonzaloMedina\lastbox建议的另一种选择:

enter image description here

\documentclass{article}
\setlength{\fboxsep}{1pt}%
\usepackage{lipsum}% http://ctan.org/pkg/lipsum

\newbox\linebox

\newcount\mycount
\def\processline{% Underline every second line
  \global\advance\mycount by 1
  \ifodd\mycount
    \makebox[\textwidth][c]{\smash{\fbox{\box\linebox}}}%
  \else
    \box\linebox
  \fi}

\def\splitlines{%
  \setbox\linebox\lastbox
  \ifvoid\linebox
    \noindent\ignorespaces
  \else
    \unskip\unpenalty
    \begingroup\splitlines\space\endgroup
    \processline
  \fi}

\long\def\doit#1{\vbox{#1\par\splitlines}}

\begin{document}

\doit{\lipsum[1]}

\end{document}

尽管我已将每个奇数行都框起来,但代码应该可以轻松修改以满足您的要求(旋转、反射等)。

以上内容摘自并修改自如何仅显示段落的某些行?其中还包括一些其他的实现。

相关内容