Skip to content

Instantly share code, notes, and snippets.

@m4dc4p
Created December 7, 2011 00:22
Show Gist options
  • Save m4dc4p/1440770 to your computer and use it in GitHub Desktop.
Save m4dc4p/1440770 to your computer and use it in GitHub Desktop.
TeX sample that will create a vertical rule next to a given paragraph
Justin Bailey 2011
jgbailey@codeslower.com
To use: surround paragraphs to place a rule
with \startrule and \endrule.
E.g.:
\startrule
This paragraph will have a rule around it.
\endrule
Multiple paragraphs can be spanned as well. Rules will break across
pages but it will have the effect of making your document
\raggedbottom.
You can change the offset of the rule by setting \ruleoffset. Rules
are always offset from the left margin.
A simple \codeblock environment is included too.
To use it, surround the code with \codeblock{
}
Code must appear in the group. The group must immediately follow \codeblock.
Code is set ragged right, obeying newlines, using typewriter font.
\input vert
%% one blank line at beginning and end.
\codeblock{
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
}
%% No blank lines.
\codeblock{
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
}
%% No blank lines.
\codeblock{void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
}
\startrule
asdljflasd dasjfdlf lasdfdflaslfjlsadf sajf lsdfas Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Quisque sollicitudin pretium
quam, id condimentum felis rutrum quis. Nullam venenatis libero ac
ante blandit euismod. Suspendisse sit amet nisl vel leo feugiat
rutrum. Fusce vestibulum ornare lorem in fermentum. Sed et facilisis
massa. Vivamus non leo quis magna egestas volutpat hendrerit a
libero. Morbi interdum lacus sit amet ligula suscipit et tempor enim
varius. Sed vel erat massa, a vehicula ligula. Proin felis eros,
feugiat non fermentum ac, volutpat vel metus. Nunc tortor enim,
aliquet id feugiat sed, auctor a elit. Phasellus in tortor diam, in
vestibulum enim. Phasellus imperdiet semper tellus, ac malesuada lacus
scelerisque eget. Quisque consectetur volutpat est, nec lobortis diam
ullamcorper vitae. In vulputate nulla eu odio congue posuere.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
\endrule
{\ruleoffset=-1pt\codeblock{
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
}}
%% This page break draws the rule on the second page instead
%% of on the first and second.
\startrule\obeylines\raggedright %%
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
\endrule
{\ruleoffset=-5pt\codeblock{
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
void main(int argc, char *argv[]) \char123
printf("Hello, world!{\char92}n");
\char125
}}
\startrule
Vestibulum lacus orci, hendrerit eget rutrum sed, pharetra nec
tellus. Sed risus turpis, pretium ac condimentum id, pharetra et
nisl. Sed auctor ipsum et tortor eleifend facilisis. Nulla vel erat
nulla, eu ullamcorper mi. Nullam dapibus neque arcu, nec consectetur
leo. Vestibulum et est ut sapien laoreet facilisis. Ut bibendum sapien
et arcu congue ac venenatis justo cursus. Nunc laoreet leo sit amet
odio sagittis malesuada. Fusce eu odio justo. Morbi tempor luctus
elit, in rhoncus justo gravida a. Quisque ornare tristique neque et
venenatis. Ut volutpat ultricies est id egestas.
\endrule
\startrule
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
Cras vel tortor lorem. Curabitur enim ligula, ullamcorper at eleifend
a, aliquet quis tortor. Pellentesque aliquam, nisl sed consectetur
pulvinar, purus augue aliquam tortor, vitae ornare sem magna vitae
augue. Suspendisse magna eros, sollicitudin ac consequat sed, pulvinar
sed turpis. Nulla neque orci, eleifend a placerat at, imperdiet a
nunc. Nulla malesuada eros id ante accumsan feugiat. Nunc tortor
neque, pretium in egestas quis, semper ac neque. Cras ut leo vitae
arcu aliquam mattis a et erat. Maecenas consequat, mauris quis
pulvinar eleifend, est urna varius eros, quis aliquam risus orci
accumsan urna. Pellentesque habitant morbi tristique senectus et netus
et malesuada fames ac turpis egestas. Mauris varius eleifend elit quis
adipiscing. In urna justo, lacinia quis venenatis eget, pulvinar quis
magna. Curabitur neque libero, vestibulum non eleifend a, venenatis
vitae lectus. Cum sociis natoque penatibus et magnis dis parturient
montes, nascetur ridiculus mus.
\endrule
{\narrower
\startrule
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
\endrule
}
{\startrule\obeylines\raggedright\parindent=0pt %%
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
\endrule}
\bye
\input vert
\showboxbreadth=1000 \showboxdepth=1
asdljflasd dasjfdlf lasdfdflaslfjlsadf sajf lsdfas Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Quisque sollicitudin pretium
quam, id condimentum felis rutrum quis. Nullam venenatis libero ac
ante blandit euismod. Suspendisse sit amet nisl vel leo feugiat
rutrum. Fusce vestibulum ornare lorem in fermentum. Sed et facilisis
massa. Vivamus non leo quis magna egestas volutpat hendrerit a
libero. Morbi interdum lacus sit amet ligula suscipit et tempor enim
varius. Sed vel erat massa, a vehicula ligula. Proin felis eros,
\noindent In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
zzzIn hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
%% The rule is drawn only on the second page here.
\startrule
xxx Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam nonnon mauris. In gravida arcu sit amet felis vestibulum placerat.
yyy Integer blandit lorem non magna tincidunt
\endrule
x
x
asdljflasd dasjfdlf lasdfdflaslfjlsadf sajf lsdfas Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Quisque sollicitudin pretium
quam, id condimentum felis rutrum quis. Nullam venenatis libero ac
ante blandit euismod. Suspendisse sit amet nisl vel leo feugiat
rutrum. Fusce vestibulum ornare lorem in fermentum. Sed et facilisis
massa. Vivamus non leo quis magna egestas volutpat hendrerit a
libero. Morbi interdum lacus sit amet ligula suscipit et tempor enim
varius. Sed vel erat massa, a vehicula ligula. Proin felis eros,
feugiat non fermentum ac, volutpat vel metus. Nunc tortor enim,
aliquet id feugiat sed, auctor a elit. Phasellus in tortor diam, in
vestibulum enim. Phasellus imperdiet semper tellus, ac malesuada lacus
scelerisque eget. Quisque consectetur volutpat est, nec lobortis diam
ullamcorper vitae. In vulputate nulla eu odio congue posuere.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
commodo orci vitae nulla consectetur interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Vivamus vitae urna at tortor fringilla suscipit id a augue. Morbi
tristique, mi in pharetra congue, nulla eros ullamcorper augue, in
egestas orci dui eget massa. Morbi id pharetra elit. Duis ornare
malesuada tempus. Curabitur vehicula vulputate lorem a accumsan. In
hac habitasse platea dictumst. Nunc lectus tortor, porttitor at ornare
vel, sodales vel dolor.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Cras viverra, arcu nec euismod eleifend, leo leo posuere
lectus, non varius velit nisi vitae turpis. Proin faucibus erat id
velit scelerisque tristique. Integer sit amet nisl nulla. Phasellus
%% No rule at all is drawn here.x
\startrule %%
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam nonnon mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt
\endrule
\bye
\input vert
\showboxbreadth=1000 \showboxdepth=2
{\tt Normal paragraph.} In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales.
{\tt Normal paragraph.} Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales.
%% No indent honored
\startrule\noindent {\bf Space between this paragraph and previous looks
right; no indentation.} In hac habitasse platea dictumst. Etiam rutrum
blandit velit sed rutrum. Curabitur rhoncus erat a turpis suscipit
vitae rutrum turpis sodales. \endrule
%% Inter-paragraph spacing correct
\startrule {\sl Space between this paragraph and previous looks right.} In
hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales.
\endrule\tracingcommands=0\tracingmacros=0
%% Inter-paragraph spacing correct
\startrule\noindent {\it Space between this paragraph and previous looks right; no indentation.}
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales.
\endrule
%% Inter-paragraph
{\it Space between this paragraph and previous looks right.} In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales.
\startrule {\bf This rule spans multiple paragraphs}. In hac habitasse
platea dictumst. Etiam rutrum blandit velit sed rutrum. Curabitur
rhoncus erat a turpis suscipit vitae rutrum turpis sodales. Space
between this paragraph and previous looks right.
In hac habitasse platea dictumst. Etiam rutrum blandit velit sed
rutrum. Curabitur rhoncus erat a turpis suscipit vitae rutrum turpis
sodales. Space between this paragraph and previous looks right.
\endrule
\bye
\input vert
\raggedbottom
Morbi luctus lacinia lectus, in pretium sem sollicitudin
\startrule %%
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
Integer blandit lorem non magna tincidunt tempus. Donec quis quam non
urna imperdiet porta. Aenean auctor eros quis neque dictum pulvinar
dignissim. Integer euismod, nulla ac tincidunt mollis, est lorem
volutpat. Donec dui sem, feugiat vulputate gravida ut, sollicitudin
non mauris. In gravida arcu sit amet felis vestibulum placerat.
\endrule
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
Morbi luctus lacinia lectus, in pretium sem sollicitudin
nec. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Proin ut sodales eros. Donec tortor
sapien, posuere et interdum ac, laoreet at nunc. In sit amet libero
eget justo lobortis rutrum a lobortis massa. Aliquam et eros
leo. Fusce in libero id purus consectetur mattis sodales sit amet
lectus. Pellentesque id quam eget diam suscipit viverra. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Sed faucibus accumsan tellus, vel sodales magna fermentum
sed. Nam egestas mi et justo luctus non dictum odio aliquam.
\bye
%% Justin Bailey 2011
%% jgbailey@codeslower.com
%%
%% To use: surround paragraphs to place a rule
%% with \startrule and \endrule.
%%
%% E.g.:
%%
%% \startrule
%% This paragraph will have a rule around it.
%% \endrule
%%
%% Multiple paragraphs can be spanned as well. Rules will break across
%% pages but it will have the effect of making your document
%% \raggedbottom.
%%
%% You can change the offset of the rule by setting \ruleoffset. Rules
%% are always offset from the left margin.
%%
%% A simple \codeblock environment is included too.
%%
%% To use it, surround the code with \codeblock{
%%
%% }
%%
%% Code must appear in the group. The group must immediately follow \codeblock.
%% Code is set ragged right, obeying newlines, using typewriter font.
\newdimen\ruleoffset \ruleoffset=-2pt %% Horizontal offset for the
%% rule. This is the parameter that
%% should be set by the user.
\newbox\parbox %% Holds our collected paragraph
\newdimen\startpar \startpar=-1000pt %% Where the paragraph started
\newdimen\endpar \endpar=0pt %% Where the paragraph ended
\newdimen\roffset %% For calculating offset from left margin for rule.
\newtoks\savedout \savedout=\output %% Previous output routine
\newdimen\interparskip
%% A hbox with no width, height or depth. Used to ensure
%% empty lines have at least one item, which prevents
%% underfull warnings.
\newbox\zerobox \setbox\zerobox=\hbox to 0pt{\vrule height0pt width0pt}
\newbox\charbox \setbox\charbox=\hbox{.}
%% Capture all paragraphs in a \vbox so we can keep
%% track of their height. If this macro is not in vertical
%% mode, it will emit a \par to force vertical mode.
\def\startrule{\ifvmode\else\par\penalty0\fi%%
%% Capture value of \ruleoffset so it survives the group. This ensures
%% that when the output routine calls \makerule we get the right value
\xdef\setroffset{\roffset=\the\leftskip \advance\roffset by \the\ruleoffset}%%
\xdef\theprevdepth{\the\prevdepth}%%
\startpar=\pagetotal \endpar=-1000pt%% Sentinel value.
\setbox\parbox=\vbox\bgroup}
%% Insert a rule from the top of the paragraph to the end. If
%% the paragraph started on the previous page this will put a
%% rule only on the bottom portion.
\def\endrule{\egroup
%% Do not calculated inter-paragraph glue if
%% nothing exists on the page yet.
\if\pagegoal=\maxdimen\relax\else%%
%% Calculate inter-paragraph glue by setting captured text
%% ourselves. We know the heights of everythign but the glue. Use
%% \vtop in boht cases so height of box is only the first line, not
%% the entire box.
\setbox2=\vtop{X\par}%%
\setbox4=\vtop{\unvcopy\parbox}%%
%% Set \prevdepth so inter-paragraph glue is calculated based
%% on the paragraph that really preceded \startrule, not our
%% fake paragraph.
\setbox0=\vbox{\copy2\par\prevdepth=\theprevdepth\copy4}%%
\interparskip=\ht0 \advance\interparskip by -\ht4 \advance\interparskip by -\ht2%%
%% Add \penalty so \output routine triggers if necessary.
\vskip\interparskip\par\penalty0%%
\fi%%
\ifnum\startpar>-1000\relax%% A page break occurred when startpar = -1000.
%% \pagetotal represents where our paragraph will start.
\startpar=\pagetotal%%
\fi%%
%% Add \penalty below so \output will run if necessary.
\unvbox\parbox\par\penalty0%%
\xdef\theprevdepth{\the\prevdepth}%%
\endpar=\pagetotal%% Record where we are.
%% Make the rule start at the top of the first line, extending to
%% the bottom of the last line.
\if\endpar>\pagegoal%%
\dimen0=\pagegoal%%
\else%%
\dimen0=\endpar%%
\fi%%
\ifnum\startpar>-1000\relax%% when true, rule starts at top of page.
%% Otherwise, \startpar in middle of page, \endpar also in middle
\advance\startpar by -\pagedepth%%
\advance\dimen0 by -\startpar%%
\fi%%
\makerule\dimen0/%%
\endpar=0pt%% Prevents \lastrule from drawing a rule
\startpar=-1000pt%%
\prevdepth=\theprevdepth}
%% An output routine that handles breaking rules across
%% page boundaries. After adding a rule, runs the default (or prior)
%% output routine.
\def\lastrule{%%
\ifnum\endpar<0\relax%
%% Any glue in box255 will screw up \startpar - the paragraph might
%% have moved since we recorded its position. Therefore, we reset the
%% box to its natural height and put all the stretching at the
%% bottom.
\setbox0=\vbox{\unvcopy255} \dimen0=\ht0%%
\ifnum\startpar>-1000\relax%%
%% \startpar in middle of page, \endpar at bottom.
\advance\startpar by -\dp0%% Make sure rule covers the entire paragraph.
\advance\dimen0 by -\startpar%%
\wlog{output: dimen0: \the\dimen0}%%
\fi%%
\setbox255=\vbox{\unvbox255\makerule\dimen0/\vfil}%%
\global\startpar=-1000pt%%
\fi%%
%% Run previous output routine.
\the\savedout%%
}
%% Handles drawing the rule, using the height given in the dimension
%% register passed. Notice the slash used to delimit the
%% argument. Used internally by macros above.
\def\makerule#1/{%%
%% Keep prevdepth so interline spacing isn't affected by our vbox
%% (from
%% http://tex.stackexchange.com/questions/22355/make-an-invisible-vbox)
\nointerlineskip%% No glue between previous vbox and this
\nobreak\vbox to 0pt{\hrule height 0pt depth0pt width0pt\vskip -#1%% \hrule ensures reference point is at the top of the box.
%% This box contains the rule of the given height, offset from the
%% left margin by \ruleoffset.
\hbox to 0pt{\setroffset%%
%% \hss removes an underfull warning
\kern\roffset\vrule height#1 width1pt depth0pt\hss}}%%
%% Restoring prevdepth ensures next paragraph
%% is spaced correctly from previous one.
\prevdepth=\theprevdepth}
%% Ensures spaces at the beginning of the line are always
%% preserved. TABs will not be. Thanks to TeX for the Impatient
%% (eplain) for \alwayspace.
{\gdef\alwaysspace{\hglue\fontdimen2\the\font \relax}%%
\obeyspaces\gdef {\alwaysspace}}
%% Define new lines so that in \codeblock they don't start a new
%% paragraph - they just insert a line break.
{\catcode`\^^M=\active \gdef^^M{\copy\zerobox\hfil\break} \global\let\ret=^^M}
\newtoks\codetoks
%% \codeblock must be followed by a group or it has no effect.
%% When followed by a group, the text found will be set on
%% individual lines as they appear in the group (i.e. new lines
%% are obeyed). The entire group will be have a rule next to it.
%% The group is also set in typewriter font, with ragged-right
%% margins.
%%
%% Note that text in the group is NOT set verbatim.
\def\codeblock{\codetoks={}%%
%% Removes final lineskip if one was there.
\gdef\endo{\unpenalty\endrule\prevdepth=0pt\relax}%%
%% Removes initial newline, if one was there. Otherwise, reinsert the
%% token captured.
\gdef\ignorenewline{\ifx\next\ret%%
\else\next%%
\fi}%%
\gdef\do{\ifx\next\bgroup%%
\codetoks={\startrule\noindent\bgroup%%
\ttraggedright%%
\parindent=0pt%%
\tt%%
\aftergroup\endo%%
\ignorespaces%%
\catcode`\^^M=\active\obeyspaces%%
\afterassignment\ignorenewline\let\next= }%%
\fi\the\codetoks}%%
\ignorespaces\afterassignment\do\let\next= }
\output={\lastrule} %% Use our custom output routine.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment