在我的环境中,我想自动在段落中的每一行文本周围创建一个框,以便我可以对每一行进行操作。我认为这应该在 LaTeX 中完成,而不是在纯 TeX 中完成,以免破坏文本着色和换行。我已经研究这个问题有一段时间了,但仍然不清楚如何安全地使用 LaTeX 完成此操作,因此任何帮助都将不胜感激。
这是用于排版萨法伊克语、萨比安语和一些古希腊书写系统中的牛耕式书写,以及 Rongorongo(复活节岛)中出现的反向牛耕式书写。对于牛耕式书写,我可以使用镜像法,\reflectbox
因为这种书写方向就像牛在田里转圈一样。对于 Rongorongo,我可以使用镜像法\rotatebox[origin=c]{180}{
,因为每隔一行旋转 180 度。
答案1
你是說這樣嗎?
这只是一个开始,我把它放在一起,没有过多关注细节。特别是它假设每个段落只产生框和行间惩罚和粘合(各一个)。如果段落包含任何 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}
答案3
以下是使用@GonzaloMedina\lastbox
建议的另一种选择:
\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}
尽管我已将每个奇数行都框起来,但代码应该可以轻松修改以满足您的要求(旋转、反射等)。
以上内容摘自并修改自如何仅显示段落的某些行?其中还包括一些其他的实现。