University of New South Wales COMP 6721
(In-)Formal Methods: The Lost Art 2020 Term 2
Assignment 1 —
Respecting assertions and invariants
Due 9:00pm Friday 3 July 2020 (end Week 5)1
Typsetting a paragraph in L
ATEX style
LATEX typesets paragraphs so that they fill the horizontal space exactly, both the
left- and right-hand sides (as for this paragraph). It does that by putting just enough blank space between the words to get the right width overall. That’s the program we will be writing in this assignment, more or less — but our program will only approximate LATEX’s approach, because we will use a fixed-width font.
As you will see, however— the assignment is not about how to typeset. It’s abouthow to write programs using assertions and invariants. Typesetting just happens to be an intricate-enough problem to make it interesting.
Figure 1(a) shows how some text in a fixed-width font is made into a para-graph exactly 37 columns wide (except for the last line).1 The “greedy”
type-setting (at left) fills each line as much as possible before moving on to the next. Then enough extra space is added to every line except the last, between words, so that it finishes exactly at the right-hand margin.
In general,greedyalgorithms take decisions based on the “current” situation, and do not look ahead to see whether a di↵erent decision now might lead to a better outcome later on.
In Fig. 1(b) the same text is typeset (at right), but now using a “clever” algo-rithm (dynamic programming) that optimises (minimises) the average amount of extra space that must be added between words in each line.
In this assignment you will program a clever paragraph-maker inPython3.
Be sure however to read Sec. 8 below carefully — it describes how the assignment will be marked (including penalties, if applicable, for late submission).
1The text is the abstract of
Donald E. Knuth and Michael F. Plass. Breaking Paragraphs into Lines. Software Practice and Experience 11(1119–84), 1981.
which describes the way that TEX and (thus) LATEX make paragraphs. 1
How L
ATEX sets paragraphs
abstract from Donald E. Knuth and Michael F. Plass.Breaking Paragraphs into Lines. This paper discusses a new approach
to the problem of dividing the text
of a paragraph into lines of approximately equal length. Instead of simply making decisions one line at a time, the method considers the paragraph as a whole, so that the final appearance of a given line might be influenced by the text on succeeding lines. A system based on three simple primitive concepts called boxes, glue, and penalties provides the ability to deal satisfactorily with a wide variety of typesetting problems in a unified framework, using a single algorithm that determines optimum breakpoints. The algorithm avoids backtracking by a judicious use of the techniques of dynamic programming. Extensive computational experience confirms that the approach is both efficient
and effective in producing
high-quality output. The paper concludes with a brief history of line-breaking methods, and an appendix presents a simplified algorithm that requires comparatively few resources.
1234567890123456789012345678901234567 (a) Greedy strategy: cost14/3 = 4.67
This paper discusses a new approach to the problem of dividing the
text of a paragraph into lines of approximately equal length. Instead of simply making decisions one line at a time, the method considers
the paragraph as a whole, so
that the final appearance of a given line might be influenced by the text on succeeding lines. A system based on three simple primitive concepts called boxes, glue, and penalties provides the ability to deal satisfactorily with a wide variety of typesetting problems in a unified framework, using a single algorithm that determines optimum breakpoints. The algorithm avoids backtracking by a judicious use of the techniques of dynamic programming. Extensive computational experience confirms that the approach is both efficient and effective in producing high-quality output. The paper concludes with a brief history of line-breaking methods, and an appendix presents a simplified algorithm that requires comparatively few resources.
1234567890123456789012345678901234567 (b) Clever strategy: cost14/5 = 2.80 The paragraph above is set in a column of 37 spaces in both cases: but a greedy strategy is used on the left and a clever one on the right.
The greedy paragraph took textinto the second line “because it could”, but paid for it later with extra white space in the last ten lines.
Thecost of a typesetting is the maximum over all lines (except the last) of the average white space between adjacent words on each line separately.
2
Assertions and invariants
Although this assignment asks you to write the clever, dynamic-programming algorithm, and test it, it is not about that algorithm itself, nor is it about dynamic programming. (You will learn more about those things in other courses.)
This assignment is about how to use assertions, invariants and static rea-soning to write complicated programs and get them right. The dynamic pro-gramming here is just an example of where it really helps. Thus there won’t be a “test suite” to check that your program is working correctly, and it won’t be run through an “auto marker”. Instead, it’s your actual source code that will be marked, as for an an essay, and your mark will depend on how well you have written it. (And that is normal for this course.)
Here therefore are some key points in the way the assignment is presented: (a) Your code will be written in Python3.2 (NotC, not Java, not anything
else.) That’s partly to make it feasible to mark, but also because of (b). (b) You are given (below) an overall program structure to start with (written in
Python3), and it will have –as comments– someassertionswritten already. (c) Your actual programming job will be to “Fill in the code between the
as-sertions.” That’s where you will gain your marks.
(d) Because of (b,c), your program will use the variable names chosen for you already. If you need extra variables, of course you can name them yourself. (There should be very few.) The principal ones must remain as given. (e) The code templates that contain questions (Figs. 3,4,5) you should type in
yourself — really. They won’t be in a downloadable file. (You don’t have to type in the comments; but you might consider doing some of them anyway.) That’s not only to ease the version-control problem between any extra files and this.texfile, but as well for the more important reason that, because typing takes time, you will be forced to think about what you are doing. This whole assignment is about how to think e↵ectively as you program; and typing (rather than swiping,) is one of the tricks.
2Python2is acceptable; but it is no longer supported. The code here is inPython3. Do not use anything other thanPython.
3
The general strategy of this algorithm
The program will be given a line-widthM and a file of blank-separated words, over as many lines as you like. Line-breaks and multiple spaces are treated as blanks. The program will place the words in a sequencewdsof character strings. The output of the program will be a paragraph, built fromwds, in which all lines (except possibly the last) are exactlyMcharacters long, achieved by adding blanks between words where necessary. The program prints the paragraph.
And that paragraph will be ofoptimal (minimum) cost, where the cost of a single line is the average number of blanks that are needed between each adjacent pair of words and the overall cost is the largest cost of any single line (excluding the last line). For example, if the words on a line have lengths 4,5,9,1,3,8 (as in the first line of Fig. 1) and the line-widthMis 37, then 37 (4+5+9+1+3+8) = 7 blanks must be distributed over the 5 inter-word spaces. Since we can use only whole blanks, we might mix 1- and 2-blank spaces in the pattern 1,2,1,2,1. Or perhaps 2,2,1,1,1; or 1,1,1,2,2. Butgaps-lengths must not di↵er by more than one within a single line. Thus 1,1,1,1,3 is not allowed.
The program will be in three principal parts:
Part (1) Starting from the end of the list of words, calculate the minimum possible cost of making a paragraph for successively longer suffixes. (That’s the dynamic-programming part.)
Part (2) Use the the results of (1), starting from the beginning of the list of words, to split the words into lines such that each line fits within the line-width and the cost of that line is no worse than the minimum achievable for the whole paragraph.
Part (3) Use the results of (2) to print out the actual paragraph, complete with the extra blanks necessary so that each line takes exactlyMcharacters. And there is a Part (0) part that is just concerned with reading the input.
4
Part (0) — Read the input.
The Python3 code of Fig. 2 reads the list of words from standard input, and the line width from the command line. Enter it and test it. (You may copy-and-paste this part from thepdf; but you will need to tidy it up.)
Test your code by printing out what (you think) you have read in and have taken from the command line: wdsandwlsandM.
You do not have to hand in this part on its own; but youdo have to hand it in as part of the larger program, as explained in later parts of the assignment.
from sys import argv,stdin ### Paragraph.py --- Synopsis #
# % python3 Paragraph.py WIDTH < WORDS #
# The column WIDTH is given as the only argument; WORDS come from standard # input, over as many lines as it takes. Multiple blanks and linefeeds # are treated as a single blank, and wholly blank lines are ignored. # EOF from the terminal is ^D (as usual).
#
# The program prints WORDS in lines of exactly WIDTH characters, except # possibly the last. It minimises the largest average-per-line white space # between words in order to achieve right justification, that is to make # a straight right margin.
#
# Although the average white space needed in a line might not be a # whole number of blanks, the program simulates that in a fixed-width # font by using a mixture of "just more than" and "just less than" # inter-word gaps.
### Part (0) --- Collect input.
# Get the line-width from command line.
assert len(argv)==2, "\n%s: Exactly one argument expected.\n"%argv[0]+ \ "\nusage: python3 %s WIDTH < WORDS"%argv[0]
M= int(argv[1])
# Get the words and their lengths from standard input into wds and wls. # Invariant: wds contains all the words read so far.
# and wds contains their lengths. wds,wls= [],[]
for line in stdin.readlines():
for w in line.split(): wds.append(w); wls.append(len(w)) # Check that the input satisfies the program’s precondition. assert wds!=[], "The list of words may not be empty."
for w in wls: assert w<=M, "Each word must be able to fit on a line alone." N= len(wds) # N words in total.
print("wds is",wds) print("wls is",wls) print("M is",M)
print("There are",N,"words in total.")
### Do not hand this file in on its own; DO test it. ###
You may copy-and-paste the code here directly from thepdf— but you will have to fix some white-space copying errors afterwards. Only a few.
% If wds[l:h] is a single word, then the line made % from it has either 1 gap (at the end of the word, say) % or no gap at all (if the word is of length M exactly). % In both those cases, the Cost should be the number % of blanks needed to make that single word take up % M spaces.
Ignore the "exactly fits" case in your coding here; that is, act as if an exactly fitting word does have 1 gap. By good fortune, the function will work anyway.
Once the assignment's deadline has passed, I will change
this function body. ("Good fortune" is not good enough for us :-)
5
Part (1) — Calculate the minimum costs
The dynamic-programming aspect of this algorithm is that in order to minimise (optimise) the cost of the whole paragraph, we actually find the optimum costs for all its suffixes along the way. Thus we introduce a sequence of real numberscs[0:N](forcosts), and the postcondition of this part will be that
For all n in [:N] we have # [:N] is Python for 0,1,...,.N-1 . cs[n] == "the optimal achievable cost of typsettting
suffix wds[n:] in line-width M."
That means that in particularcs[0]will be the optimal achievable cost for the whole paragraph.
A code skeleton for this is shown in Fig. 3. The bluetext is the assertions (including invariants) that you must respect when you write your code. Typing them in as well will help you to make sure that you have. Theredtext identifies the places where you must supply code.
For Part (1), fill in the missing portionsAAA· · ·IIIof the skeleton given in Fig. 3; the number after the three letters is the marks available. Type it in; and test it together with the code you used for Part (0) by including theprint cs
at the end to check those values against your test inputs.
/
1
Put your code for Parts (0,1) into a single (text) file Para1-yourZID.py, whereyourZIDis your student number. Include your name and student num-ber as a comment at the beginning of the file. That is the first file that you will submit for marking — see Sec. 8.3. It will be marked based on how well your added red code in this part (that replaced AAA· · ·III) respects the blue assertions in Fig. 3. If it does, then it should (also) produce the correct output as shown by theprint cs—but do not hand your tests in.Do make sure your program “so far” compiles and runs, however, since I might test it myself if I am unsure the assertions are being respected. And –obviously– do not change the assertions or change any variable names.
6
Part (2) — Calculate the paragraph lines
In Part (2) the results of Part (1), thecssequence, are used to split the original listwdsof words into the separate lines that will achieve the optimal-cost layout for the paragraph overall.
This time we start from the front of wls, making the lines of the eventual paragraph one by one. For each of those lines we take as many words as are nec-essary to reach a “rest of paragraph” point where the overall cost is sufficiently low. (This is a greedy algorithm, not a dynamic-programming algorithm.)
Fill in the missing portionsJJJ· · ·NNNof the skeleton given in Fig. 4. Type it in; and test it in combination with your earlier code printing cs andwlss
and checking that against your test input.
/
2
Put your code for Parts (0,1,2) into a (text) filePara2-yourZID.pyby itself. Include your name and student number as a comment at the beginning of the file. You will submit that for marking — see Sec. 8.3.It will be marked based on how well your added red code in Part (3) respects the blue assertions in Fig. 4. Do not hand your tests in.
Note in particular that Answer MMM asks not for code, but for an answer in prose: for this one, statewhy the statementi= i+1maintains the invariant
Inv3and add it as a comment to your program.
7
Part (3) — Print the paragraph
The final part of this program prints out the formatted paragraph, filling every line (expect the last) so that it takes exactly M spaces. Given that thelengths of the paragraph’s lines are now available in wlss, that seems an easy job: something like
for ws in wlss: l= len(ws)
ls,wds= wds[:l],wds[l:]
print ls # Blanks needed here.
would do... sort of. Except for the “blanks needed here” issue. The main job this part is theMakeLinefunction, which inserts those blanks. In that function there are, as usual, things to fill in: fromOOOtoRRR.
An important note: you are not required to fill in the needed blanks in any particular order: you can put all longer ones at the front, or at the back. It doesn’t matter. But you must not have gaps whose lengths di↵er by more than one within a single line. Thus for example to get 7 blanks into 3 gaps you can have 2,2,3 or 2,3,2 or 3,2,2 — but you cannot have 1,2,4 or similar. The second half of this part also has a loop, but it’s so trivial –print every line– that it probably doesn’t need assertions/invariants so much. And so, in this part only, we have usedMeaningfulVariableNames.
MVN is indeed good style, but only up to a point. It makes the program more verbose — and if you have to do calculations with the assertions (especially if they’re on paper), then that can become a bit tedious and, indeed, error prone.
The "forall" should not be there.
### Part (3b) --- # Construct the lines of the paragraph, # one-by-one, and print them out. maxBlanks,lineCount= 0,0 # For reporting only. for ws in wlss:
ls,wds= wds[:len(ws)],wds[len(ws):] # Get the actual words. gapsHere= len(ws)-1
if wds==[]: line= MakeLine(ls,gapsHere); print(line) # Last line. else:
blanksNeededHere= M-sum(ws)
line= MakeLine(ls,blanksNeededHere) maxBlanks= max(maxBlanks, \
blanksNeededHere/gapsHere \
if len(ws)>1 else blanksNeededHere) print("%s %d/%d = %.2f." % ( \
line, blanksNeededHere, \
gapsHere,blanksNeededHere/gapsHere \ if len(ws)>1 else blanksNeededHere) )
lineCount= lineCount+1 print(" "*M+"^")
print(("==> 567890"+("1234567890"*floor(M/10)))[:M]+"|")
print("==> The maximum (fractional) white space for column width" + \ " %3d was %.2f over %d lines." % \
(M, maxBlanks,lineCount))
### Hand this in, together with the code from Figs. 2,3,4,5 ### as a single Para3-yourZID.py file.
### It is your complete program.
You may copy-and-paste this.
8
How this assignment will be marked
Do not spend any time in Secs. 9, 10 unless you have completed the main as-signment. You can get full marks for correct answers toAAA· · ·RRR.
8.1
Testing — must be done; but who does it?
With luck, it will be you and not me: you are expected to test your program –of course– butdo not submit your test results. Still, if you would like for example to see for yourself how your program handles a fixed input over varying column widths, use something like
for ((M= 0; M <= maximumWidth; M++))
do python3 Para3_z1234567.py $M < inputFile | tail -1
done
inzsh(the “zed shell”). Other shells can do similar.
Each of the three.pyfiles still should have in it the test printcommands that you used for testing it yourself. That way I can test it too — if I have to. (Seehttp://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDFon p7.)
8.2
What will get marks — and what won’t
AAA 3 BBB 2 CCC 1 DDD 2 EEE 5 FFF 2 GGG 4 HHH 2 III 1 JJJ 2 KKK 2 LLL 6 MMM 4 NNN 3 OOO 4 PPP 2 QQQ 2 RRR 3 SSS · · · ⇠0 ZZZ P 50
Here’s how to get good marks: If you were asked to fill-inAAAandBBBfor the program
# N>=0 n,s= N,0
while AAA: # INV: s==sum(as[n:])
BBB
# s==sum(as)
and you answered
# Answer Prog1 # N>=0
n,s= N,0
while n!=0: # INV: s==sum(as[n:]) n= n-1
s= s+as[n] # s==sum(as)
then you would get full marks. Your answer need not be coloured; but the replacements n!=0 and n= n-1; s=s+as[n] you gave for AAA and BBB must respect theblue assertionsthat were there already.
Here’s how to lose marks: If on the other hand your answer had been this program (which does correctly calculate the sum)
# Answer Prog2 # N>=0
n,s= 0,0
while n!=N: # INV: s==sum(as[n:]) s,n= s+as[n],n+1
# s==sum(as)
then your marks would be considerablylessthan full. For even thoughProg2
satisfies the Hoare triple
{N>=0} Prog2 {s==sum(as)}
it does not respect the invariants==sum(as[n:]) that was supplied.
In “real life” you could of course change the invariant to something that
Answer 2doesrespect,4and indeed in the long run that’s the point: you must
find your own invariants. But in this assignment you are not allowed to change the assertions— for learning to respect assertions (ultimately, your own or your team mates’) is what this assignment is practising.
Thus the program fragments you fill in must respect theblue assertionsthat are supplied: if they don’t, you risk losing marks even if your program is correct. Each three-letter question identifier fromAAAup toRRRcomes with a small number indicating how many marks it is worth. Their total is 50, and your mark will contribute 30% to the overall course mark.
The question identifiers from SSSto ZZZhave no mark indicators because they are optional, just for those who are interested in looking further. Ex-ceptionally good work there might, however, gain a few marks extra in the assignment overall. But you can get 100% for fully correct work onAAAup to RRRalone.
8.3
Frequently Asked Questions
• What happens if I change the assertions? If you think an assertion is wrong, contact the lecturer (me)privately. If you change the assertion, you risk losing marks.
• What happens if my program works but it does not respect the assertions? If your program does not respect the assertions, then you cannot be sure it is working. At best, your tests have established only that it probably works. Any of your answers that don’t respect the assertions that surround them risk receiving few marks.
• What happens if my program respects the assertions, but doesn’t work?
// Can’t happen. If your program respects the assertions, then itmust work. 5
4What would it be?
• What exactly must I hand in, by when, and how?
/
(1,2,3)
You must hand in the files asked for in the marginal indications 1,2,3, that is three text-filesPara1-yourZID.py,Para2-yourZID.pyandPara3-yourZID.py. Zip them together into a single zip-fileCOMP6721-Ass1-yourZID.zipand sub-mit it following the instructions that will be given nearer the time. (It will probably be via Moodle.)
Be careful to use exactly the file names given, and to make sure that your zIDand name occurs withineach file as a Python comment) as well as having thezID within the file names exactly as shown — please. Random file names cause confusion, lead to extra work for the marker and can cause errors.
The assignment submission is due at9:00pm on Friday 3 July 2020, the end of Week 5. Late submissions will be mark-capped at 85% up to one day; for two days at 75%, three days at 65% and four days at 50%. After four days late, submissions are no longer accepted.
9
Extras
There are no marks “officially” available for this section (or the next); thus don’t attempt it unless you have completed the assignment proper. Still, there could be a small benefit available if some of this is really well done.
9.1
Greedy typesetting
If you’d like to compare your program with the (much simpler) greedy approach, you can change just your answer to Part (2) so that it fills lines greedily, ignoring Part (1) — which you can leave just sitting there, since it does no harm.
What change would you make? SSS
9.2
Even spacing
In MakeLines the blanks are distributed over the line to make it exactly M
characters long. And some white-spaces will be longer than others. How would you make all the longer white-spaces come before the shorter ones? TTTOr all longer ones come after the shorter ones? UUU
What about making the distribution of longer and shorter white-spaces be more or less even, as in Fig. 1? VVV
5. . . unless of course the assertions themselves are wrong. I have tried to make sure they are right.
9.3
Number of lines used
Minimising the white space has a disadvantage, that in some case more lines might be used overall than for the greedy strategy. (Look ahead to Sec. 10.) That is, a greedy strategy might not be pretty, but it probably does save paper. Can you see why our current code doesn’t necessarily use as few lines as possible, even though it minimises average white space? WWW
10
Epilogue: a very long paragraph
As for Sec. 9, there are no marks “officially” available for this section; again, don’t attempt it unless you have completed the assignment proper. Still, there could be a small benefit available if some if this is really well done.
The text in the figures below comes from Moby Dick;6I found it by looking
for the longest sentence in English that (1) would still fit on one page and (2) came from a book I had heard of. You might like to try others.7 In Fig. 7 it
is typeset with the greedy strategy, and a large white space occurs (13 blanks) near the end; but at least the fewest number of lines (102) is used. Can you explain rigorously why the greedy strategy is guaranteed to use the fewest lines? (Of course it’s “obvious” — but can you be rigorous about it?)XXX
In Fig. 8 the code of this assignment is used, in particular Part (2). It takes more lines, but the average white space is drastically reduced: the cost is reduced from 13 to 3.50.
In Fig. 9 the code of this assignment is again used, except that Part (2) is modified to take thelongest line possble consistent with minimising the white space (which, being minimum, must be the same as for Fig. 8). However it takes fewerlines than Fig. 8 — though still more than Fig. 7. (See Sec. 9.3.)
Can you modify our Part (2) to achieve the e↵ect of Fig. 9? Do it by proposing a revisedInv4first — of course.YYYWhat’s your new loop?ZZZ
Carroll Morgan 8 June 2020 6Moby-Dick; Or, The Whale. Herman Melville. Harper & Brothers, 1851.
7https://thejohnfox.com/long-sentences/
Though in many natural objects, whiteness refiningly
enhances beauty, as if
imparting some special virtue of its own, as in marbles, japonicas, and pearls; and though various nations have
in some way recognised a
certain royal preeminence in - this hue; even the barbaric,
grand old kings of Pegu
placing the title ’Lord of the White Elephants’ above all their other magniloquent ascriptions of dominion; and
the modern kings of Siam
unfurling the same snow-white
quadruped in the royal
standard; and the Hanoverian - flag bearing the one figure of a snow-white charger; and the great Austrian Empire,
Caesarian, heir to
overlording Rome, having for the imperial colour the same imperial hue; and though this pre-eminence in it applies to the human race itself, giving
the white man ideal
- mastership over every dusky tribe; and though, besides, all this, whiteness has been
even made significant of
gladness, for among the
Romans a white stone marked a
joyful day; and though in
other mortal sympathies and symbolizings this same hue is
made the emblem of many
- touching, noble things
---the innocence of brides, the
benignity of age; though
among the Red Men of America the giving of the white belt
of wampum was the deepest
pledge of honour; though in
many climes, whiteness
typifies the majesty of
Justice in the ermine of the - Judge, and contributes to the
daily state of kings and
queens drawn by milk-white steeds; though even in the higher mysteries of the most august religions it has been made the symbol of the divine spotlessness and power; by the Persian fire worshippers, the white forked flame being
held the holiest on the
-altar; and in the Greek
mythologies, Great Jove
himself being made incarnate
in a snow-white bull; and
though to the noble Iroquois, the midwinter sacrifice of the sacred White Dog was by far the holiest festival of
their theology, that
spotless, faithful creature -being held the purest envoy they could send to the Great
Spirit with the annual
tidings of their own
fidelity; and though directly
from the Latin word for
white, all Christian priests derive the name of one part of their sacred vesture, the
alb or tunic, worn beneath
-the cassock; and though among the holy pomps of the Romish
faith, white is specially
employed in the celebration of the Passion of our Lord; though in the Vision of St. John, white robes are given
to the redeemed, and the
four-and-twenty elders stand clothed in white before the -great-white throne, and the Holy One that sitteth there white like wool; yet for all these accumulated associations, with whatever is sweet, and honourable, and sublime, there yet lurks an
elusive something in the
innermost idea of this hue, which strikes more of panic -to the soul than that redness which affrights in blood.
Line-width 29, cost13, lines used 102.
Though in many natural objects, whiteness refiningly
enhances beauty, as if
imparting some special virtue of its own, as in marbles, japonicas, and pearls; and though various nations have
in some way recognised
a certain royal preeminence
- in this hue; even the
barbaric, grand old kings of Pegu placing the title ’Lord of the White Elephants’ above all their other magniloquent
ascriptions of dominion;
and the modern kings of
Siam unfurling the same
snow-white quadruped in the
royal standard; and the
- Hanoverian flag bearing the one figure of a snow-white
charger; and the great
Austrian Empire, Caesarian,
heir to overlording Rome,
having for the imperial
colour the same imperial hue; and though this pre-eminence
in it applies to the
human race itself, giving the
- white man ideal mastership
over every dusky tribe;
and though, besides, all
this, whiteness has been
even made significant of
gladness, for among the
Romans a white stone marked
a joyful day; and though
in other mortal sympathies and symbolizings this same
- hue is made the emblem
of many touching, noble
things --- the innocence
of brides, the benignity
of age; though among the
Red Men of America the
giving of the white belt
of wampum was the deepest
pledge of honour; though
in many climes, whiteness
- typifies the majesty of
Justice in the ermine of
the Judge, and contributes
to the daily state of
kings and queens drawn
by milk-white steeds; though even in the higher mysteries of the most august religions it has been made the symbol of the divine spotlessness
and power; by the Persian
-fire worshippers, the white
forked flame being held
the holiest on the altar;
and in the Greek mythologies, Great Jove himself being made
incarnate in a snow-white
bull; and though to the
noble Iroquois, the midwinter
sacrifice of the sacred
White Dog was by far
-the holiest festival of -their
theology, that spotless,
faithful creature being held the purest envoy they could
send to the Great Spirit
with the annual tidings
of their own fidelity; and
though directly from the
Latin word for white, all
Christian priests derive the
-name of one part of their
sacred vesture, the alb
or tunic, worn beneath the
cassock; and though among
the holy pomps of the Romish
faith, white is specially
employed in the celebration of the Passion of our Lord;
though in the Vision of
St. John, white robes are
-given to the redeemed, and the four-and-twenty elders stand clothed in white before the great-white throne, and
the Holy One that sitteth
there white like wool; yet
for all these accumulated
associations, with whatever
is sweet, and honourable,
and sublime, there yet lurks -an elusive something in the innermost idea of this hue, which strikes more of panic to the soul than that redness which affrights in blood.
Line-width 29, cost 3.50, lines used 105.
Though in many natural objects, whiteness refiningly
enhances beauty, as if
imparting some special virtue of its own, as in marbles, japonicas, and pearls; and though various nations have in some way recognised a certain royal preeminence in - this hue; even the barbaric,
grand old kings of Pegu
placing the title ’Lord of the White Elephants’ above all their other magniloquent ascriptions of dominion; and
the modern kings of Siam
unfurling the same snow-white
quadruped in the royal
standard; and the Hanoverian - flag bearing the one figure
of a snow-white charger;
and the great Austrian
Empire, Caesarian, heir to overlording Rome, having for the imperial colour the same imperial hue; and though this pre-eminence in it applies to
the human race itself,
giving the white man ideal - mastership over every dusky tribe; and though, besides, all this, whiteness has been
even made significant of
gladness, for among the
Romans a white stone marked a
joyful day; and though in
other mortal sympathies and symbolizings this same hue is
made the emblem of many
- touching, noble things
---the innocence of brides, the
benignity of age; though
among the Red Men of America the giving of the white belt
of wampum was the deepest
pledge of honour; though
in many climes, whiteness
typifies the majesty of
Justice in the ermine of the - Judge, and contributes to the
daily state of kings and
queens drawn by milk-white
steeds; though even in the higher mysteries of the most august religions it has been made the symbol of the divine spotlessness and power; by the Persian fire worshippers,
the white forked flame
being held the holiest on
-the altar; and in the
Greek mythologies, Great
Jove himself being made
incarnate in a snow-white
bull; and though to the
noble Iroquois, the midwinter
sacrifice of the sacred
White Dog was by far the
holiest festival of their
theology, that spotless,
-faithful creature being held the purest envoy they could
send to the Great Spirit
with the annual tidings of
their own fidelity; and
though directly from the
Latin word for white, all
Christian priests derive the
name of one part of their
sacred vesture, the alb or
-tunic, worn beneath the
cassock; and though among the
holy pomps of the Romish
faith, white is specially
employed in the celebration of the Passion of our Lord;
though in the Vision of
St. John, white robes are
given to the redeemed, and
the four-and-twenty elders
-stand clothed in white before the great-white throne, and
the Holy One that sitteth
there white like wool; yet for all these accumulated associations, with whatever
is sweet, and honourable,
and sublime, there yet lurks an elusive something in the innermost idea of this hue, -which strikes more of panic to the soul than that redness which affrights in blood.
Line-width 29, cost 3.50, lines used 103.