summaryrefslogtreecommitdiffstats
path: root/share/sgml/FreeBSD/doc/guide.sgml
blob: 65e4cca6d7436fd646642ebfa763bfb9473aeb5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
<!-- This is a linuxdoc-sgml User's Guide, by Matt Welsh
     See guide.txt or guide.dvi for formatted output.
     (You need to read this before you can format the source!)
-->

<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN">

<article>

<title>Linuxdoc-SGML User's Guide
<author>Matt Welsh, <tt/mdw@sunsite.unc.edu/
<date>v1.3, 7 June 1994
<abstract>
This document is a user's guide to the linuxdoc-sgml formatting system,
an SGML-based text formatter which allows you to produce LaTeX, plain
ASCII, and HTML from a single source format. This guide documents
Linuxdoc-SGML version 1.1.
</abstract>

<toc>

<sect>Introduction

<p>
This is a user's guide to the <tt/linuxdoc-sgml/ document
processing system, for use with Linux documentation. <tt/linuxdoc-sgml/
is an SGML DTD (Document Type Definition) and set of ``replacement files''
which convert the SGML to <tt/groff/, LaTeX, and HTML source. In the future,
<tt/linuxdoc-sgml/ will support <tt/texinfo/, as well as other
formats. 

<tt/linuxdoc-sgml/ is based heavily on the QWERTZ DTD by Tom Gordon,
<tt/thomas.gordon@gmd.de/. I have only made revisions to his DTD and
replacement files for use by Linux documentation. 

<tt/linuxdoc-sgml/ is not meant to be a general document-processing system.
Although it can be used for documents of many types, I have tailored it for
use by the Linux documentors in producing HOWTOs, FAQs, and (later) the
Linux Documentation Project manuals. Therefore, I have tweaked features
into and out of the system for this purpose. If you see a lack of generality
in the system, that is the reason. There's nothing binding <tt/linuxdoc-sgml/
to Linux documentation, but all documents produced by the system will look
a certain way. If you want things to look differently I suggest that you use
a more generalized system such as the plain QWERTZ DTD.

One of the goals of this system is to make documents easy to produce in
numerous formats. Until now, most Linux documentation has been produced
in plain ASCII through manual editing. A system like <tt/groff/ can take care
of the plain-text formatting, but that still doesn't give you HTML (for
use on the World Wide Web), LaTeX (for nicely printed documents), or
<tt/texinfo/. Therefore, if there are features missing from this system 
that you would like, <em/please let me know!/ The idea is that we shouldn't
have to use a lot of hackery to produce good-looking docs in multiple formats.
The author should have to do as little as possible.

<sect1>About this document

<p>
This document is written using the <tt/linuxdoc-sgml/ DTD. It contains
more or less everything you need to know to write SGML docs with this
DTD. See <tt/example.sgml/ for an example of an SGML document that you
can use as a model for your own docs.

<sect1>Why SGML?

<p>
I chose SGML for this system because SGML is made specifically for translation
to other formats. SGML, which stands for Standard Generalized Markup Language,
allows you to specify the <em/structure/ of a document---that is, what kinds
of things make up the document. You specify the structure of a document with
a DTD (Document Type Definition). <tt/linuxdoc-sgml/ is one DTD that specifies
the structure for Linux HOWTOs and other docs. QWERTZ is another DTD; the
SGML standard provides DTD's for books, articles, and other generic document
types.

The DTD specifies the names of ``elements'' within the document. An element
is just a bit of structure---like a section, a subsection, a paragraph,
or even something smaller like <em/emphasised text/. Unlike LaTeX, however,
these elements are not in any way intrinsic to SGML itself. The
<tt/linuxdoc-sgml/ DTD happens to define elements that look a lot like 
their LaTeX counterparts---you have sections, subsections, verbatim
``environments'', and so forth. However, using SGML you can define any kind
of structure for the document that you like. In a way, SGML is like 
low-level TeX, while the <tt/linuxdoc-sgml/ DTD is like LaTeX.

Don't be confused by this analogy. SGML is <em/not/ a text-formatting system.
There is no ``SGML formatter'' per se. SGML source is <em/only/ converted
to other formats for processing. Furthermore, SGML itself is used only to 
specify the document structure. There are no text-formatting facilities or
``macros'' intrinsic to SGML itself. All of those things are defined within
the DTD. You can't use SGML without a DTD---a DTD defines what SGML does.

<sect1>How it works

<p>
Here's how processing a document with SGML and the <tt/linuxdoc-sgml/ DTD 
works. First, you need a DTD. I'm using the QWERTZ DTD which was produced,
originally, by a group of people who needed a LaTeX-like DTD. I've modified
the QWERTZ DTD to produce the <tt/linuxdoc-sgml/ DTD for our purposes. 
The DTD simply sets up the structure of the document. A small portion of
it looks like this:
<tscreen><verb>
<!element article - -
        (titlepag, header?, 
         toc?, lof?, lot?, p*, sect*, 
         (appendix, sect+)?, biblio?) +(footnote)>
</verb></tscreen>
This part sets up the overall structure for an ``article'', which is like
a ``documentstyle'' within LaTeX. The article consists of a titlepage
(<tt/titlepag/), an optional header (<tt/header/), an optional table of 
contents (<tt/toc/), optional lists of figures (<tt/lof/) and tables
(<tt/lot/), any number of paragraphs (<tt/p/), any number of top-level
sections (<tt/sect/), optional appendices (<tt/appendix/), an optional
bibliography (<tt/biblio/) and footnotes (<tt/footnote/). 

As you can see, the DTD doesn't say anything about how the document should
be formatted or what it should look like. It just defines what parts make
up the document. Elsewhere in the DTD the structure of the 
<tt/titlepag/, <tt/header/, <tt/sect/, and other elements are defined. 

You don't need to know anything about the syntax of
the DTD in order to write documents. I'm just presenting it so you know
what it looks like and what it does. You <em/do/ need to be familiar with
the document <em/structure/ that the DTD defines. If not, you might
violate the structure when attempting to write a document, and be very
confused about the resulting error messages. We'll describe the
structure of <tt/linuxdoc-sgml/ documents in detail later.

The next step is to write a document using the structure defined by the
DTD. Again, the <tt/linuxdoc-sgml/ DTD makes documents look a lot like
LaTeX---it's very easy to follow. In SGML jargon a single document written
using a particular DTD is known as an ``instance'' of that DTD. 

In order to translate the SGML source into another format (such as LaTeX
or nroff) for processing, the SGML source (the document that you wrote)
is <em/parsed/ along with the DTD by (you guessed it) the SGML <em/parser/.
I'm using the <tt/sgmls/ parser by James Clark, <tt/jjc@jclark.com/, who
also happens to be the author of <tt/groff/. We're in good hands.
The parser (the executable <tt/sgmls/ simply picks through your document and 
verifies that it follows the structure set forth by the DTD. It also spits out
a more explicit form of your document, with all ``macros'' and elements
expanded, which is understood by <tt/sgmlsasp/, the next part of the
process. 

<tt/sgmlsasp/ is responsible for converting the output of <tt/sgmls/ to
another format (such as LaTeX). It does this using <em/replacement files/,
which describe how to convert elements in the original SGML document into
corresponding source in the ``target'' format (such as LaTeX or <tt/nroff/). 

For example, part of the replacement file for LaTeX looks like:
<tscreen><verb>
<itemize>       +       "\\begin{itemize}"      +
&etago;itemize>      +       "\\end{itemize}"        +
</verb></tscreen>
Which says that whenever you begin an <tt/itemize/ element in the 
SGML source, it should be replaced with 
<tscreen><verb>
\begin{itemize}
</verb></tscreen>
in the LaTeX source. (As I said, elements in the <tt/linuxdoc-sgml/ DTD
are very similar to their LaTeX counterparts). 

So, to convert the SGML to another format, all you have to do is write
a new replacement file for that format that gives the appropriate 
analogues to the SGML elements in that new format. In practice, it's not
that simple---for example, if you're trying to convert to a format that
isn't structured at all like your DTD, you're going to have trouble. In 
any case, it's much easier to do than writing individual parsers and
translators for many kinds of output formats; SGML provides a generalized
system for converting one source to many formats.

Once <tt/sgmlsasp/ has completed its work, you have LaTeX source which
corresponds to your original SGML document, which you can format using
LaTeX as you normally would. Later in this document I'll give examples
and show the commands used to do the translation and formatting. You can
do this all on one command line.

But first, I should describe how to install and configure the software.

<sect>Installation
<p>
The file <tt/linuxdoc-sgml.tar.gz/ contains everything that you need
to write SGML documents and convert them to LaTeX, nroff, and HTML. 
In addition to this package, you will need one or both of the following:
<enum>
<item><tt/groff/. You <em/need/ version 1.08 or 1.09. Apparently some of
the margin-handling in <tt/groff/ is in a state of flux from version to
version; they both work, but you get slightly different results. 
(Particularly, with 1.09 the left margin isn't indented two characters as 
it is in 1.08. There is a way around it, but it looks terrible on 1.08.
Versions previous to 1.08 <em/will not work/. 
You can get this from <tt/prep.ai.mit.edu/ in 
<tt>/pub/gnu</tt>. There is a Linux binary version on <tt/sunsite/ as well.
You will need <tt/groff/ to produce plain ASCII from your SGML docs.
(TeX/LaTeX will be used to produce nicely-printed PostScript and .dvi). 

<item>TeX and LaTeX. This is available more or less everywhere; you should
have no problem getting it and installing it (there is a Linux binary
distribution on <tt/sunsite/). Of course, you only need TeX/LaTeX
if you want to format your SGML docs with LaTeX. So, installing TeX/LaTeX
is optional. See the section on the Linux HOWTO project below for how we'll
manage this vis-a-vis the Linux HOWTOs. 

<item>If you want to view the generated HTML, I suggest getting NCSA Mosaic
2.2 or later.

</enum>
Neither of these are required by the SGML system, but I suggest that you get
one or the other in order to format your docs and verify that they look 
all right before distributing them. 

<sect1>Installing the software

<p>
The steps needed to install and configure the <tt/linuxdoc-sgml/ stuff are
as follows:

<enum>
<item>First, unpack the tar file <tt/linuxdoc-sgml.tar.gz/ somewhere. 
This will create the directory <tt/linuxdoc-sgml/ where all of the SGML
files live. It doesn't matter where you unpack this file; just don't
move things around within the <tt/linuxdoc-sgml/ directory.

<item>Next, you need to compile the <tt/sgmls/ parser. In the
<tt>linuxdoc-sgml/sgmls-1.1</tt> directory, issue the commands:
<tscreen><verb>
$ make config.h
$ make
$ make install
$ make install.man
</verb></tscreen>
This should compile the parser and translator, and place the binaries
<tt/sgmls/, <tt/sgmlsasp/, and <tt/rast/ in <tt>linuxdoc-sgml/bin</tt>.
I suggest that you don't move those binaries from that location; instead,
make symlinks to them from <tt>/usr/local/bin</tt> or place
<tt>linuxdoc-sgml/bin</tt> on your path. (If you move things around
within the <tt/linuxdoc-sgml/ tree you'll have to edit a number of files
to get everything to cooperate again. Best to leave things as-is.) 

If things don't work try editing the <tt/Makefile/ in the <tt/sgmls-1.1/
directory. I have it set to use <tt/gcc/ as the compiler, and use
rather malignant options. Compiles fine on Linux and sun-4 systems.

This will also install man pages for the three binaries in 
<tt>linuxdoc-sgml/man</tt>. You can move those or link them to your
regular man page tree, should you need them.

<item>Edit the variables at the top of the scripts <tt/format/, <tt/qroff/,
<tt/preroff/, <tt/prehtml/, and <tt/qtex/ in <tt>linuxdoc-sgml/bin</tt>. 
All you really need to edit is the value of the <tt>LINUXDOC</tt> 
shell variable which gives the full pathname of the <tt>linuxdoc-sgml</tt>
directory.

<item>In the <tt>html-fix</tt> directory, issue the commands:
<tscreen><verb>
$ make
$ make install
</verb></tscreen>
This will build <tt>fixref</tt> and <tt>html2html</tt>, which are post
processors for the HTML conversion, and place them in the <tt>bin</tt>
directory.

</enum>

If all went well, you should be ready to use the system. Just be sure
that <tt>linuxdoc-sgml/bin</tt> is on your path or you've linked the 
files therein to your standard binary directories. Again, don't just copy 
them somewhere else; the scripts expect to find each other in that
directory.

<sect1>Testing it out

<p>
You can now test the system. The <tt/format/ script takes an SGML
document as input and translates it to a given format. The <tt/qtex/
script will process the output of <tt/format/ using LaTeX, and 
<tt/qroff/ will process it using nroff.

Let's say you have the SGML document <tt/foo.sgml/. You can translate
it to LaTeX, and produce PostScript output (via <tt/dvips/) with
the command:
<tscreen><verb>
$ format -T latex foo | qtex > foo.ps
</verb></tscreen>
Or, you can produce a DVI file using the <tt>-d</tt> switch with 
<tt>qtex</tt>, as so:
<tscreen><verb>
$ format -T latex foo | qtex -d > foo.dvi
</verb></tscreen>

If you want to produce plain ASCII, through <tt/groff/, use the command:
<tscreen><verb>
$ format -T nroff foo | qroff > foo.txt
</verb></tscreen>
Note that I have tailored the <tt/groff/ conversion for plain ASCII output.
(That is, I've removed page headers, page numbers, changed the margins,
and so on.) With some hacking you can produce PostScript and DVI from the 
<tt/groff/ resulting from <tt/format/, but I suggest that you use LaTeX
for that instead.

If you want to produce HTML, the procedure is a bit more complicated,
because of cross-references. Here's an example:
<tscreen><verb>
$ format -T html foo.sgml | prehtml | fixref > tmp.html
$ format -T html foo.sgml | prehtml >> tmp.html
$ cat tmp.html | html2html foo > foo.html
$ rm tmp.html
</verb></tscreen>
This will produce <tt>foo.html</tt>, as well as <tt>foo-1.html</tt>,
<tt/foo-2.html/, and so on---one file for each section of the document.
Run your WWW client on <tt>foo.html</tt>, which is the toplevel file.
Also make sure that all of the HTML files corresponding to your document
are in one directory, as they reference each other with local URLs. 

A good way to test this would be to run it on this file,
<tt/guide.sgml/. 

If you just want to capture your errors from the SGML conversion,
use something like
<tscreen><verb>
$ format -T nroff foo > /dev/null
</verb></tscreen>

<sect1>Development note
<p>

The HTML conversion is, at this time, rudimentary but adequate. In the
future there will be support for cross-references, navigation buttons, 
external URLs, and the like. Something is better than nothing. :)

Also, if you'd like to help me implement a texinfo (or plain Info) 
conversion for Linuxdoc-SGML, let me know! As with HTML we'll have to
do some pre- and post-processing (which you supposedly shouldn't need with
SGML, ah well), but that's not a big issue. 

<sect>Writing Documents with <tt/linuxdoc-sgml/

<p>
For the most part, writing documents using the <tt/linuxdoc/ DTD is very
simple, and somewhat like LaTeX. However, there are some caveats to watch
out for. In this section I'll give an introduction on writing SGML docs.
See the file <tt/example.sgml/ for an SGML example document (and tutorial)
which you can use as a model when writing your own docs. Here I'm just going
to discuss the various features of SGML, but the source is not very 
readable as an example. Instead, print out the source (as well as the
formatted output) for <tt/example.sgml/ so you have a real live case to
refer to.

<sect1>Basic concepts

<p>
Looking at the source of the example document, you'll notice right off
that there are a number of ``tags'' marked within angle brackets
(<tt>&lt;</tt> and <tt/>/). A tag simply specifies the beginning or end
of an element, where an element is something like a section, a paragraph,
a phrase of italicized text, an item in a list, and so on. Using a tag
is like using a LaTeX command such as <tt>&bsol;item</tt> or 
<tt>&bsol;section{...}</tt>.

As a simple example, to produce <bf>this boldfaced text</bf>, I typed
<tscreen><verb>
As a simple example, to produce <bf>this boldfaced text&etago;bf>, ...
</verb></tscreen>
in the source. <tt>&lt;bf></tt> begins the region of bold text, and
<tt>&etago;bf></tt> ends it. Alternately, use can use the abbreviated form
<tscreen><verb>
As a simple example, to produce <bf/this boldfaced text/, ...
</verb></tscreen>
which encloses the bold text within slashes. (Of course, you'll need to
use the long form if the enclosed text contains slashes, such as the
case with UNIX filenames). 

There are other things to watch out with respect to special characters 
(that's why you'll notice all of these bizarre-looking ampersand 
expressions if you look at the source; I'll talk about those shortly).

In some cases, the end-tag for a particular element is optional. For
example, to begin a section, you use the <tt>&lt;sect></tt> tag, 
however, the end-tag for the section (which could appear at the end of
the section body itself, not just after the name of the section!) 
is optional and implied when you start another section of the same depth.
In general you needn't worry about these details; just follow the model
used in the tutorial (<tt/example.sgml/), and feel free to ask me if you 
have any questions about the particulars.

<sect1>Special characters

<p>
Obviously, the angle brackets are themselves special characters in the
SGML source. There are others to watch out for. For example, let's say 
that you wanted to type an expression with angle brackets around it,
as so: <tt>&lt;foo></tt>. In order to get the left angle bracket, you
must use the <tt>&amp;lt</tt> element, which is a ``macro'' that expands
to the actual left-bracket character. Therefore, in the source, I typed
<tscreen><verb>
angle brackets around it, as so: <tt>&ero;lt;foo>&etago;tt>.
</verb></tscreen>
Generally, something beginning with an ampersand is a special macro. For
example, there's <tt/&amp;percnt/ to produce <tt>&percnt;</tt>, 
<tt/&amp;verbar/ to produce <tt>&verbar;</tt>, and so on. For all 
``special characters'' there exist these ampersanded-entities to represent
them. 

Usually, you don't need to use the ampersand macro to get a special
character, however, in some cases it is necessary. The most commonly used
are:
<itemize>
<item>Use <tt>&amp;amp;</tt> for the ampersand (<tt>&amp;</tt>), 
<item>Use <tt>&amp;lt;</tt> for a left bracket (<tt>&lt;</tt>),
<item>Use <tt>&amp;gt;</tt> for a right bracket (<tt>&gt;</tt>),
<item>Use <tt>&amp;etago;</tt> for a left bracket with a slash 
(<tt>&etago;</tt>)
<item>Use <tt>&amp;dollar;</tt> for a dollar sign (<tt>&dollar;</tt>),
<item>Use <tt>&amp;num;</tt> for a hash (<tt>&num;</tt>),
<item>Use <tt>&amp;percnt;</tt> for a percent (<tt>&percnt;</tt>),
<item>Use <tt>``</tt> and <tt>''</tt> for quotes, or use
      <tt>&amp;dquot</tt> for <tt>&dquot;</tt>.
</itemize>

<sect1>Verbatim and code environments

<p>
While we're on the subject of special characters, I might as well mention
the verbatim ``environment'' used for including literal text in the output
(with spaces and indentation preserved, and so on). The 
<tt>verb</tt> element is used for this; it looks like the following:
<tscreen><verb>
<verb>
  Some literal text to include as example output.
&etago;verb>
</verb></tscreen>
The <tt>verb</tt> environment doesn't allow you to use <em/everything/
within it literally. Specifically, you must do the following within
<tt/verb/ environments.
<itemize>
<item>Use <tt>&amp;ero;</tt> to get an ampersand, 
<item>Use <tt>&amp;etago;</tt> to get <tt>&etago;</tt>,
<item>Don't use <tt>&bsol;end{verbatim}</tt> within a <tt>verb</tt>
environment, as this is what LaTeX uses to end the <tt>verbatim</tt> 
environment. (In the future, it should be possible to hide the underlying
text formatter entirely, but the parser doesn't support this feature yet.) 
</itemize>
The <tt>code</tt> environment is much just like the <tt/verb/ environment,
except that horizontal rules are added to the surrounding text, as so:
<code>
Here is an example code environment.
</code>

You should use the <tt/tscreen/ environment around any <tt/verb/ environments,
as so:
<tscreen><verb>
<tscreen><verb>
Here is some example text. 
&etago;verb>&etago;tscreen>
</verb></tscreen>
<tt/tscreen/ is an envionment that simply indents the text and sets the 
sets the default font to <tt/tt/. This makes examples look much nicer, both
in the LaTeX and plain ASCII versions. You can use <tt/tscreen/
without <tt/verb/, however, if you use any special characters in your 
example you'll need to use both of them. <tt/tscreen/ does nothing to 
special characters. See <tt/example.sgml/ for examples.

The <tt/quote/ environment is like <tt/tscreen/, except that it does
not set the default font to <tt/tt/. So, you can use <tt/quote/ for
non-computer-interaction quotes, as in:
<tscreen><verb>
<quote>
Here is some text to be indented, as in a quote.
&etago;quote>
</verb></tscreen>
which will generate:
<quote>
Here is some text to be indented, as in a quote.
</quote>

<sect1>Overall document structure

<p>
Before we get too in-depth with details, I'm going to describe the
overall structure of a document as defined by the <tt/linuxdoc/ DTD.
Look at <tt/example.sgml/ for a good example of how a document is set up.

<sect2>The preamble

<p>In the document ``preamble'' you set up things such as the title
information and document style. For a Linux HOWTO document this should
look like:
<tscreen><verb>
<!doctype linuxdoc system>

<article>

<title>The Linux Food-Processing HOWTO
<author>Norbert Ebersol, <tt/norbert@foo.com/
<date>v1.0, 9 March 1994
<abstract>
This document describes how to connect your Linux machine to a food-processor
for dicing vegetables.
&etago;abstract>

<toc>
</verb></tscreen>

The elements should go more or less in this order. The first line tells
the SGML parser to use the <tt/linuxdoc/ DTD. The <tt>&lt;article></tt>
tag forces the document to use the ``article'' document style. (The 
original QWERTZ DTD defines ``report'' and ``book'' as well; I haven't
tweaked these for use with <tt/linuxdoc-sgml/. Just use <tt/article/ for
you SGML docs, for now.)

The <tt/title/, <tt/author/, and <tt/date/ tags should be obvious; in the
<tt>date</tt> tag include the version number and last modification time of
the document.

Thr <tt/abstract/ tag sets up the text to be printed at the top of the
document, <em/before/ the table of contents. If you're not going to
include a table of contents (the <tt/toc/ tag), you probably don't
need an <tt/abstract/. I suggest that all Linux HOWTOs use this same format
for the preamble, so that the title, abstract, and table of contents are
all there and look the same. 

<sect2>Sectioning and paragraphs

<p>After the preamble, you're ready to dive into the document. The following
sectioning commands are available:
<itemize>
<item><tt/sect/: For top-level sections (i.e. 1, 2, and so on.) 
<item><tt/sect1/: For second-level subsections (i.e. 1.1, 1.2, and so on.)
<item><tt/sect2/: For third-level subsubsections.
<item><tt/sect3/: For fourth-level subsubsubsections.
<item><tt/sect4/: For fifth-level subsubsubsubsections.
</itemize>
These are roughly equivalent to their LaTeX counterparts <tt/section/,
<tt/subsection/, and so on.

After the <tt/sect/ (or <tt/sect1/, <tt/sect2/, etc.) tag comes the
name of the section. For example, at the top of this document, after
the preamble, comes the tag:
<tscreen><verb>
<sect>Introduction
</verb></tscreen>
And at the beginning of this section (Sectioning and paragraphs), there
is the tag:
<tscreen><verb>
<sect2>Sectioning and paragraphs
</verb></tscreen>

After the section tag, you begin the body of the section. However, you
must start the body with a <tt>&lt;p></tt> tag, as so:
<tscreen><verb>
<sect>Introduction

<p>
This is a user's guide to the <tt/linuxdoc-sgml/ document processing...
</verb></tscreen>
This is to tell the parser that you're done with the section title
and are ready to begin the body. Thereafter, new paragraphs are started
with a blank line (just as you would do in TeX). For example,
<tscreen><verb>
Here is the end of the first paragraph.

And we start a new paragraph here.
</verb></tscreen>
There is no reason to use <tt>&lt;p></tt> tags at the beginning of
every paragraph; only at the beginning of the first paragraph after
a sectioning command.

<sect2>Ending the document

<p>At the end of the document, you must use the tag:
<tscreen><verb>
&etago;article>
</verb></tscreen>

to tell the parser that you're done with the <tt/article/ element (which
embodies the entire document). 

</sect2>
<sect1>Cross-references<label id="cross-ref">

<p>Now we're going to move onto other features of the system. 
Cross-references are easy. For example, if you want to make a
cross-reference to a certain section, you need to label that section
as so:
<tscreen><verb>
<sect1>Introduction<label id="sec-intro">
</verb></tscreen>
You can then refer to that section somewhere in the text using the
expression:
<tscreen><verb>
See section <ref id="sec-intro" name="Introduction"> for an introduction.
</verb></tscreen>
This will replace the <tt/ref/ tag with the section number labelled
as <tt/sec-intro/. The <tt/name/ argument to <tt/ref/ is necessary for
<tt/nroff/ and HTML translations (at the moment). The <tt/nroff/
macro set used by Linuxdoc-SGML does not currently support cross-references,
and it's often nice to refer to a section by name instead of number. 

For example, this section is <ref id="cross-ref" name="Cross-references">.

There is also a <tt/url/ element for Universal Resource Locators, or
URLs, used on the World Wide Web. This element should be used to refer
to other documents, files available for FTP, and so forth. For
example,
<tscreen><verb>
You can get the Linux HOWTO documents from 
<url url="http://sunsite.unc.edu/mdw/linux.html" 
     name="the Linux Documentation Project home page">.
</verb></tscreen>
The <tt/url/ argument specifies the actual URL itself. A link to the
URL in question will be automatically added to the HTML document.
The optional <tt/name/ argument specifies the text that should be anchored to
the URL (for HTML conversion) or named as the description of the
URL (for LaTeX and <tt/nroff/). If no <tt/name/ argument is given, the
URL itself will be used.

For example, you can get the Linuxdoc-SGML package from
<url url="ftp://ftp.cs.cornell.edu/mdw/linuxdoc-sgml-1.1.tar.gz">.

<sect1>Fonts

<p>Essentially, the same fonts supported by LaTeX are supported
by <tt/linuxdoc-sgml/. Note, however, that the conversion to 
plain ASCII (through <tt/groff/) does away with the font 
information---I might hack up plain-ASCII representations of the
various fonts if the need arises. So, you should use fonts 
as much as possible, for the benefit of the conversion to LaTeX.
But don't depend on the fonts to get a point across in the plain
ASCII version. 

In particular, the <tt/tt/ tag described above can be used to
get constant-width ``typewriter'' font which should be used for
all e-mail addresses, machine names, filenames, and so on. 
Example:
<tscreen><verb>
Here is some <tt>typewriter text&etago;tt> to be included in the document.
</verb></tscreen>
Equivalently:
<tscreen><verb>
Here is some <tt/typewriter text/ to be included in the document.
</verb></tscreen>
Remember that you can only use this abbreviated form if the enclosed
text doesn't contain slashes.

Other fonts can be achieved with <tt/bf/ for <bf/boldface/ and <tt/em/ 
for <tt/italics/. Several other fonts are supported as well, but
I don't suggest you use them, because we'll be converting these
documents to other formats such as HTML which may not support them.
Boldface, typewriter, and italics should be all that you need.

<sect1>Lists

<p>There are various kinds of supported lists. They are:
<itemize>
<item><tt/itemize/ for bulleted lists such as this one.
<item><tt/enum/ for numbered lists.
<item><tt/descrip/ for ``descriptive'' lists. 
</itemize>
Each item in an <tt/itemize/ or <tt/enum/ list must be marked
with an <tt/item/ tag. Items in a <tt/descrip/ are marked with <tt/tag/.
For example,
<tscreen><verb>
<itemize>
<item>Here is an item.
<item>Here is a second item.
&etago;itemize>
</verb></tscreen>
Looks like this:
<itemize>
<item>Here is an item.
<item>Here is a second item.
</itemize>
Or, for an <tt/enum/,
<tscreen><verb>
<enum>
<item>Here is the first item.
<item>Here is the second item.
&etago;enum>
</verb></tscreen>
You get the idea. Lists can be nested as well; see the example document
for details.

A <tt/descrip/ list is slightly different, and slightly ugly, but
you might want to use it for some situations:
<tscreen><verb>
<descrip>
<tag/Gnats./ Annoying little bugs that fly into your cooling fan.
<tag/Gnus./ Annoying little bugs that run on your CPU.
&etago;descrip>
</verb></tscreen>
ends up looking like:
<descrip>
<tag/Gnats./ Annoying little bugs that fly into your cooling fan.
<tag/Gnus./ Annoying little bugs that run on your CPU.
</descrip>

<sect1>Miscellany

<p>
There are various other esoteric features in the system as well, most
of which you probably won't use. If you're curious, read the QWERTZ
User's Guide (from <tt/ftp.cs.cornell.edu/ in <tt>pub/mdw/SGML</tt>).
QWERTZ (and hence, <tt/linuxdoc/) supports many features such as 
mathematical formulae, tables, figures, and so forth. I don't recommend
using most of these features in the Linux HOWTOs because they won't render
well in plain ASCII. If you'd like to write general documentation in
SGML, I suggest using the original QWERTZ DTD instead of the hacked-up
<tt/linuxdoc/ DTD, which I've modified for use particularly by the Linux
HOWTOs and other documentation. 

The bottom line is, <tt/linuxdoc-sgml/ supports many other features found
in the QWERTZ DTD, but I haven't necessarily tweaked them to work well
with <tt/linuxdoc-sgml/. If you encounter problems with any of them,
please let me know.

<sect>The Linux HOWTO project

<p>How does this tie into writing HOWTOs? First of all, I'd like to see
everyone eventually convert their HOWTOs to SGML using this DTD. This has
a number of advantages. First of all, it will allow you to just send me
the SGML source, which I'll convert to plain ASCII, TeX, whatever, for
posting and archiving. Also, it will give the HOWTOs a common look and feel;
any changes that I make to the DTD will be reflected in all of the HOWTOs.

I have set up the <tt/linuxdoc/ DTD to have a certain look and feel.
If you want your document to look differently, please let me know, because
I'll need to make those changes in the DTD itself. That is, <em/do not/
modify your version of the DTD or replacement files to get other features
in the system. We all must use the same DTD and replacement files or 
this whole system will break down. If you find bugs in it, or have suggestions
for how we can change thing or add/modify features, let me know. I'll be
more than happy to accomodate you.

</article>
OpenPOWER on IntegriCloud